Android开发中WIFI和GPRS网络的切换

论坛 期权论坛 脚本     
匿名技术用户   2020-12-23 17:14   81   0

在项目的开发中因为要使用到WIFI和GPRS网络的切换,因此就研究了一下通过代码打开WIFI和GPRS的工作。


无论是切换WIFI还是切换GPRS网络都需要设置相应的权限,所以需要在AndroidManifest.xml文件中加入以下几行代码。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />


1、切换WIFI网络

public static void toggleWiFi(Context context, boolean enabled) {
  WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
  wm.setWifiEnabled(enabled);
 }

2、切换GPRS网络

由于Android没有提供直接切换GPRS网络的方法,通过查看系统源码发现,系统是调用IConnectivityManager类中的setMobileDataEnabled(boolean)方法来设置GPRS网络的,由于方法不可见,只能采用反射来调用,代码如下。

public static void toggleMobileData(Context context, boolean enabled) {
  ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

  Class<?> conMgrClass = null;  // ConnectivityManager类
  Field conMgrField = null;   // ConnectivityManager类中的字段
  Object iConMgr = null;    // IConnectivityManager类的引用
  Class<?> iConMgrClass = null;  // IConnectivityManager类
  Method setMobileDataEnabledMethod = null; // setMobileDataEnabled方法

  try {
   // 取得ConnectivityManager类
   conMgrClass = Class.forName(conMgr.getClass().getName());
   // 取得ConnectivityManager类中的对象mService
   conMgrField = conMgrClass.getDeclaredField("mService");
   // 设置mService可访问
   conMgrField.setAccessible(true);
   // 取得mService的实例化类IConnectivityManager
   iConMgr = conMgrField.get(conMgr);
   // 取得IConnectivityManager类
   iConMgrClass = Class.forName(iConMgr.getClass().getName());
   // 取得IConnectivityManager类中的setMobileDataEnabled(boolean)方法
   setMobileDataEnabledMethod = iConMgrClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
   // 设置setMobileDataEnabled方法可访问
   setMobileDataEnabledMethod.setAccessible(true);
   // 调用setMobileDataEnabled方法
   setMobileDataEnabledMethod.invoke(iConMgr, enabled);
  }
  catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
  catch (NoSuchFieldException e) {
   e.printStackTrace();
  }
  catch (SecurityException e) {
   e.printStackTrace();
  }
  catch (NoSuchMethodException e) {
   e.printStackTrace();
  }
  catch (IllegalArgumentException e) {
   e.printStackTrace();
  }
  catch (IllegalAccessException e) {
   e.printStackTrace();
  }
  catch (InvocationTargetException e) {
   e.printStackTrace();
  }
 }

根据以上所写就可以做到WIFI网络和GPRS网络的切换了。


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP