当前位置: 代码迷 >> Android >> Android在代码中打开Wifi、腾挪网络和GPS
  详细解决方案

Android在代码中打开Wifi、腾挪网络和GPS

热度:98   发布时间:2016-04-27 22:20:18.0
Android在代码中打开Wifi、移动网络和GPS
以下方法前2个在2.3.5和4.1.1中测试成功,第3个方法在2.3.5中测试没问题,但在4.1.1中无效,待解决。详见android.provider.Settings.Secure类。
?
记得在AndroidManifest.xml中声明相关权限:
[html]?view plaincopy
?
  1. <uses-permission?android:name="android.permission.ACCESS_NETWORK_STATE"/>??????
  2. <uses-permission?android:name="android.permission.ACCESS_WIFI_STATE"/>??????
  3. <uses-permission?android:name="android.permission.CHANGE_NETWORK_STATE"/>??????
  4. <uses-permission?android:name="android.permission.CHANGE_WIFI_STATE"/>??
1. 打开WiFi最简单,直接调用系统的方法即可:
[java]?view plaincopy
?
  1. /**?
  2. ?????*?WIFI网络开关??*/??
  3. ????private?void?toggleWiFi(Context?context,?boolean?enabled)?{??
  4. ????????WifiManager?wm?=?(WifiManager)?context??
  5. ????????????????.getSystemService(Context.WIFI_SERVICE);??
  6. ????????wm.setWifiEnabled(enabled);??
  7. ????}??

2. 打开移动网络比较麻烦,系统没有直接提供开放的方法,只在ConnectivityManager类中有一个不可见的setMobileDataEnabled方法,查看源代码发现,它是调用IConnectivityManager类中的setMobileDataEnabled(boolean)方法。由于方法不可见,只能采用反射来调用:
[java]?view plaincopy
?
  1. /**???
  2. ?*?移动网络开关???
  3. ?*/???
  4. private?void?toggleMobileData(Context?context,?boolean?enabled)?{????
  5. ????ConnectivityManager?conMgr?=?(ConnectivityManager)?context.getSystemService(Context.CONNECTIVITY_SERVICE);????
  6. ????Class<?>?conMgrClass?=?null;?//?ConnectivityManager类????
  7. ????Field?iConMgrField?=?null;?//?ConnectivityManager类中的字段????
  8. ????Object?iConMgr?=?null;?//?IConnectivityManager类的引用????
  9. ????Class<?>?iConMgrClass?=?null;?//?IConnectivityManager类????
  10. ????Method?setMobileDataEnabledMethod?=?null;?//?setMobileDataEnabled方法????
  11. ????try?{?????
  12. ????????//?取得ConnectivityManager类?????
  13. ????conMgrClass?=?Class.forName(conMgr.getClass().getName());?????
  14. ????//?取得ConnectivityManager类中的对象mService?????
  15. ????iConMgrField?=?conMgrClass.getDeclaredField("mService");?????
  16. ????//?设置mService可访问????
  17. ????????iConMgrField.setAccessible(true);?????
  18. ????//?取得mService的实例化类IConnectivityManager?????
  19. ????iConMgr?=?iConMgrField.get(conMgr);?????
  20. ????//?取得IConnectivityManager类?????
  21. ????iConMgrClass?=?Class.forName(iConMgr.getClass().getName());?????
  22. ????//?取得IConnectivityManager类中的setMobileDataEnabled(boolean)方法?????
  23. ????setMobileDataEnabledMethod?=?iConMgrClass.getDeclaredMethod("setMobileDataEnabled",?Boolean.TYPE);?????
  24. ????//?设置setMobileDataEnabled方法可访问?????
  25. ????setMobileDataEnabledMethod.setAccessible(true);?????
  26. ????//?调用setMobileDataEnabled方法?????
  27. ????setMobileDataEnabledMethod.invoke(iConMgr,?enabled);????
  28. ????}?catch?(ClassNotFoundException?e)?{?????
  29. ????????e.printStackTrace();????
  30. ????}?catch?(NoSuchFieldException?e)?{?????
  31. ????????e.printStackTrace();????
  32. ????}?catch?(SecurityException?e)?{?????
  33. ????????e.printStackTrace();????
  34. ????}?catch?(NoSuchMethodException?e)?{?????
  35. ????????e.printStackTrace();????
  36. ????}?catch?(IllegalArgumentException?e)?{?????
  37. ????????e.printStackTrace();????
  38. ????}?catch?(IllegalAccessException?e)?{?????
  39. ????????e.printStackTrace();????
  40. ????}?catch?(InvocationTargetException?e)?{?????
  41. ????????e.printStackTrace();????
  42. ????}???
  43. }??



3. 打开GPS也比较麻烦,与打开移动网络一样,没有直接的方法。在网上搜索了一下,据说采用反射去调用系统的方法仍然会失败,有网友用另外一条路实现了同样的功能,在2.3.5系统测试可以通过,在4.1.1系统中测试无效,待解决:
[java]?view plaincopy
?
  1. /**???
  2. ?*?<p>GPS开关???
  3. ?*?<p>当前若关则打开???
  4. ?*?<p>当前若开则关闭???
  5. ?*/???
  6. private?void?toggleGPS()?{????
  7. ????Intent?gpsIntent?=?new?Intent();????
  8. ????gpsIntent.setClassName("com.android.settings",?"com.android.settings.widget.SettingsAppWidgetProvider");????
  9. ????gpsIntent.addCategory("android.intent.category.ALTERNATIVE");??gpsIntent.setData(Uri.parse("custom:3"));????
  10. ????try?{?????
  11. ????????PendingIntent.getBroadcast(this,?0,?gpsIntent,?0).send();????
  12. ????}?catch?(CanceledException?e)?{?????
  13. ????????e.printStackTrace();????
  14. ????}???
  15. }??

?

  相关解决方案