打开和关闭wifi和移动数据链接

前一段时间,公司里面有一个这样的需要,就是要控制用户的连网方式,当时一听,wifi还好控制啦,但是那个gprs这些移动数据好像没有api的

结果一查,还真没有api给你控制,那就只好自己想办法了,当时想到,好像设置里面有这样一个开关的

然后就这样,就翻开了settings的源码来看了

结果还真让我找到了源码里面是怎样关闭移动数据的链接的

其实ConnectivityManager这个类就是控制我们的移动数据的,但它没有公开打开和关闭的这个方法,所以我们就要通过反射来调用它的这个方法了

好了,废话不多说,我们直接上图,看看效果

下面是代码

[java]

  1. package com.xiaobin.test;  
  2.   
  3. import java.lang.reflect.Method;  
  4.   
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.net.ConnectivityManager;  
  8. import android.net.NetworkInfo;  
  9. import android.net.wifi.WifiManager;  
  10. import android.os.Bundle;  
  11. import android.telephony.TelephonyManager;  
  12. import android.view.Menu;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16.   
  17. public class MainActivity extends Activity implements OnClickListener  
  18. {  
  19.     private Button bt_open_wifi;  
  20.     private Button bt_close_wifi;  
  21.     private Button bt_open_gprs;  
  22.     private Button bt_close_gprs;  
  23.     private WifiManager wifiManager;  
  24.     private TelephonyManager telephonyManager;  
  25.     private ConnectivityManager connectivityManager;  
  26.     // 这个是查看一下,现在有没有联网,如果有联网就为true,没有就为false  
  27.     private boolean isConnect = false;  
  28.   
  29.     private Method method;  
  30.   
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState)  
  33.     {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.activity_main);  
  36.   
  37.         // 拿到一个wifi管理器,用来管理wifi的开关  
  38.         wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);  
  39.         // 拿到一个telphonyManager,用来判断我们现在有没有联网的  
  40.         telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
  41.         if (telephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED)  
  42.         {  
  43.             isConnect = true;  
  44.             System.out.println(isConnect);  
  45.         }  
  46.         // 拿到一个链接管理器,打开和关闭数据链接都通过它控制了  
  47.         connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);  
  48.         NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();  
  49.         if (networkInfo == null)  
  50.         {  
  51.             System.out.println(“当前没有联网”);  
  52.         }  
  53.         else  
  54.         {  
  55.             System.out.println(networkInfo.isAvailable());  
  56.             System.out.println(networkInfo.getTypeName());  
  57.         }  
  58.   
  59.         try  
  60.         {  
  61.             // 这个是ConnectivityManager里面的一个隐藏方法,用它可以对移动数据也就是我们一般所说的gprs这些进行打开或关闭的  
  62.             // 这里有一个值得注意的就是它传递的参数是一个boolean的值,所以这个class就是要boolean.class或Boolean.TYPE  
  63.             // 我之前就是想当然的用到了Boolean.class结果弄了很久才发现过来,这是错的  
  64.             method = ConnectivityManager.class.getDeclaredMethod(  
  65.                     “setMobileDataEnabled”, Boolean.TYPE);  
  66.         }  
  67.         catch (Exception e)  
  68.         {  
  69.             e.printStackTrace();  
  70.         }  
  71.   
  72.         bt_open_wifi = (Button) findViewById(R.id.bt_open_wifi);  
  73.         bt_close_wifi = (Button) findViewById(R.id.bt_close_wifi);  
  74.         bt_open_gprs = (Button) findViewById(R.id.bt_open_gprs);  
  75.         bt_close_gprs = (Button) findViewById(R.id.bt_close_gprs);  
  76.         bt_open_wifi.setOnClickListener(this);  
  77.         bt_close_wifi.setOnClickListener(this);  
  78.         bt_open_gprs.setOnClickListener(this);  
  79.         bt_close_gprs.setOnClickListener(this);  
  80.     }  
  81.   
  82.     @Override  
  83.     public boolean onCreateOptionsMenu(Menu menu)  
  84.     {  
  85.         getMenuInflater().inflate(R.menu.main, menu);  
  86.         return true;  
  87.     }  
  88.   
  89.     @Override  
  90.     public void onClick(View v)  
  91.     {  
  92.         switch (v.getId())  
  93.         {  
  94.             case R.id.bt_open_wifi:  
  95.                 if (!wifiManager.isWifiEnabled())  
  96.                 {  
  97.                     wifiManager.setWifiEnabled(true);  
  98.                     System.out.println(“正在打开wifi”);  
  99.                 }  
  100.                 break;  
  101.   
  102.             case R.id.bt_close_wifi:  
  103.                 if (wifiManager.isWifiEnabled())  
  104.                 {  
  105.                     wifiManager.setWifiEnabled(false);  
  106.                     System.out.println(“正在关闭wifi”);  
  107.                 }  
  108.                 break;  
  109.   
  110.             case R.id.bt_open_gprs:  
  111.                 if (!isConnect)  
  112.                 {  
  113.                     try  
  114.                     {  
  115.                         method.invoke(connectivityManager, true);  
  116.                         System.out.println(“正在打开gprs”);  
  117.                         isConnect = true;  
  118.                     }  
  119.                     catch (Exception e)  
  120.                     {  
  121.                         e.printStackTrace();  
  122.                     }  
  123.                 }  
  124.                 break;  
  125.   
  126.             case R.id.bt_close_gprs:  
  127.                 if (isConnect)  
  128.                 {  
  129.                     try  
  130.                     {  
  131.                         method.invoke(connectivityManager, false);  
  132.                         System.out.println(“正在关闭gprs”);  
  133.                         isConnect = false;  
  134.                     }  
  135.                     catch (Exception e)  
  136.                     {  
  137.                         e.printStackTrace();  
  138.                     }  
  139.                 }  
  140.                 break;  
  141.   
  142.             default:  
  143.                 break;  
  144.         }  
  145.     }  
  146.   
  147. }  

其实上面的代码也是非常的简单啦,就主要的就是一个隐藏的函数setMobileDataEnabled,通过反射调用一下它就好啦

当然,还要加上相应的权限喔

[html]
  1. <uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE” />  
  2. <uses-permission android:name=“android.permission.CHANGE_NETWORK_STATE” />  
  3. <uses-permission android:name=“android.permission.ACCESS_WIFI_STATE” />  
  4. <uses-permission android:name=“android.permission.CHANGE_WIFI_STATE” />  
  5. <uses-permission android:name=“android.permission.WRITE_SETTINGS” />  

 

上面的注释也挺多的了,如果还有什么不明白的,可以留言

好啦,这一次就到这里,接下来,我会陆续把我自己在工作上遇到的技术难点写出来的啦,和大家一起学习

源码下载:http://download.csdn.net/detail/u011485531/6826617

标签