Android中使用代码开关GPS、移动网络(GPRS)、WiFi

  • Post author:
  • Post category:其他


以下方法在2.1中测试成功。理论上2.1以上应该也可以。不过2.1以后的Android版本中已经有提供了相关方法,详见

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方法,查看源代码发现,它是调用I<wbr><span style=”line-height:22px”>ConnectivityManager类中的</span><span style=”line-height:22px”>setMobileDataEnabled(boolean)方法。由于方法不可见,只能采用反射来调用:</span></wbr>





/**


* 移动网络开关


*/




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也比较麻烦,与打开移动网络一样,没有直接的方法。在网上搜索了一下,据说采用反射去调用系统的方法仍然会失败,有网友用另外一条路实现了同样的功能:




/**


* <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


();




}




}