Android在代码中打开Wifi、移动网络和GPS

以下方法前2个在2.3.5和4.1.1中测试成功,第3个方法在2.3.5中测试没问题,但在4.1.1中无效,待解决。详见Android.provider.Settings.Secure类。

记得在AndroidManifest.xml中声明相关权限:

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

1. 打开WiFi最简单,直接调用系统的方法即可:

/**
  * WIFI网络开关  */
 private void toggleWiFi(Context context, boolean enabled) {
  WifiManager wm = (WifiManager) context
    .getSystemService(Context.WIFI_SERVICE);
  wm.setWifiEnabled(enabled);
 }

2. 打开移动网络比较麻烦,系统没有直接提供开放的方法,只在ConnectivityManager类中有一个不可见的setMobileDataEnabled方法,查看源代码发现,它是调用IConnectivityManager类中的setMobileDataEnabled(boolean)方法。由于方法不可见,只能采用反射来调用:

/** 
 * 移动网络开关 
 */
private void toggleMobileData(Context context, boolean enabled) { 
    ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    Class<?> conMgrClass = null; // ConnectivityManager类 
    Field iConMgrField = null; // ConnectivityManager类中的字段 
    Object iConMgr = null; // IConnectivityManager类的引用 
    Class<?> iConMgrClass = null; // IConnectivityManager类 
    Method setMobileDataEnabledMethod = null; // setMobileDataEnabled方法 
    try { 
        // 取得ConnectivityManager类 
 conMgrClass = Class.forName(conMgr.getClass().getName()); 
 // 取得ConnectivityManager类中的对象mService 
 iConMgrField = conMgrClass.getDeclaredField("mService"); 
 // 设置mService可访问 
        iConMgrField.setAccessible(true); 
 // 取得mService的实例化类IConnectivityManager 
 iConMgr = iConMgrField.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(); 
 }
}

3. 打开GPS也比较麻烦,与打开移动网络一样,没有直接的方法。在网上搜索了一下,据说采用反射去调用系统的方法仍然会失败,有网友用另外一条路实现了同样的功能,在2.3.5系统测试可以通过,在4.1.1系统中测试无效,待解决:

/** 
 * <p>GPS开关 
 * <p>当前若关则打开 
 * <p>当前若开则关闭 
 */
private void toggleGPS() { 
    Intent gpsIntent = new Intent(); 
    gpsIntent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); 
    gpsIntent.addCategory("android.intent.category.ALTERNATIVE");  gpsIntent.setData(Uri.parse("custom:3")); 
    try { 
        PendingIntent.getBroadcast(this, 0, gpsIntent, 0).send(); 
    } catch (CanceledException e) { 
        e.printStackTrace(); 
    }
}

相关阅读:

实现Android手机通过wifi和PC连接

Android教程:wifi热点问题

访问Android硬件资源の管理网络和wifi连接

Android在wifi下手机与电脑的socket通信

Android中判断网络和wifi是否连接

Android网络连接wifi和cmnet及cmwap的问题

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/01d79abbe7c494779fa7e7dd01f87d39.html