您好,登錄后才能下訂單哦!
最近在做mobile data on/off的功能,可能我說mobile data大家沒什么概念,但是我如果說wifi on/off大家一定知道,而且也曉得如何去實現(xiàn),mobile data其實就是我們不用wifi的時候,用自己手機里的SIM卡上網(wǎng)流量,即那個數(shù)據(jù)交換的開關(guān)。
這部分對我來說其實也是陌生的地方,不過通過上網(wǎng)查資料,也逐漸了解了一些,下面跟大伙分享一下:
實現(xiàn)這個功能,我們需要根據(jù)Android系統(tǒng)的版本將其分成兩個階段,分別實現(xiàn)。
在2.3版本以下,我們需要用所謂的Java反射機制去實現(xiàn)
public void switchMobileData(boolean on) throws Exception{ try{ Method dataConnSwitchMethod; Class telephonyManagerClass; Object ITelephonyStub; Class ITelephonyClass; TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); switch(telephonyManager.getDataState()){ case TelephonyManager.DATA_CONNECTED: System.out.println("DATA_CONNECTED"); break; case TelephonyManager.DATA_DISCONNECTED: System.out.println("DATA_DISCONNECTED"); break; } telephonyManagerClass = Class.forName(telephonyManager.getClass().getName()); Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony"); getITelephonyMethod.setAccessible(true); ITelephonyStub = getITelephonyMethod.invoke(telephonyManager); ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName()); if(on){ System.out.println("on is true" ); dataConnSwitchMethod = ITelephonyClass.getDeclaredMethod("enableDataConnectivity"); } else{ System.out.println("on is false" ); dataConnSwitchMethod = ITelephonyClass.getDeclaredMethod("disableDataConnectivity"); } dataConnSwitchMethod.setAccessible(true); dataConnSwitchMethod.invoke(ITelephonyStub); } catch (Exception e) { // TODO: handle exception Log.e("Error", e.toString()); } }
使用時直接調(diào)用上面的函數(shù),參數(shù)列表true/false分別代表開/關(guān)。不過2.3版本以下此功能有一個限制,就是必須在手動將數(shù)據(jù)交換圖標點亮后,才能去控制mobile data的on/off,而且,就是在off之后,數(shù)據(jù)交換圖標還是亮著的狀態(tài),不過這個時候上不了網(wǎng)罷了,但是如果你不亮開數(shù)據(jù)交換圖標,再怎么調(diào)用也還是沒有用的。
在2.3版本及以上的Android系統(tǒng)中,可以使用 IConnectivityManager.setMobileDataEnabled() 這是個隱藏的方法,就是直接控制手機 'Settings -> Wireless & network -> Mobile network settings -> Data Enabled' 這個操作路徑下的方法,也就是我想控制的mobile data
public static void setMobileDataEnabled(Context context, boolean enabled){ final ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); Class cmClass = Class.forName(cm.getClass().getName()); final Field iConnectivityManagerField = cmClass.getDeclaredField("mService"); iConnectivityManagerField.setAccessible(true); final Object iConnectivityManager = iConnectivityManagerField.get(cm); final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName()); final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE ); setMobileDataEnabledMethod.setAccessible(true); setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled); }
使用時也是直接調(diào)用就可以,context傳入的是當前activity的對象,enabled傳入true/false,控制開關(guān)。
以上兩個方法就是針對 mobile data on/off的實現(xiàn),大家不要忘記需要在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"> </uses-permission>
此權(quán)限。
說到這就順便把如何查看當前設(shè)備的網(wǎng)絡連接跟大伙說一下,因為通常這些都是配套使用的。
//檢查當前的網(wǎng)絡狀態(tài) public static void checkNetworkState(Menu menu, Context context){ ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo wifiinfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo mobileinfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if(wifiinfo != null && wifiinfo.isAvailable()) { //如果wifi已經(jīng)打開 if(wifiinfo.isConnected()) { //wifi已經(jīng)連接上 } else { //wifi可用,但是沒有進行連接 } } else { //如果wifi為關(guān)閉狀態(tài) } if(mobileinfo != null && mobileinfo.isAvailable()) { //移動數(shù)據(jù)連接 可用 if(mobileinfo.isConnected()) { //移動數(shù)據(jù)已經(jīng)連接 } else { //移動數(shù)據(jù)未連接 } } else { //說明該設(shè)備并沒有移動數(shù)據(jù)連接功能 } }
上面的方法是判斷wifi連接還是正常的移動數(shù)據(jù)連接
還有一種方法就是比較全的,可以把所有的與當前設(shè)備連接或可以使用的網(wǎng)絡顯示出來
public void showNetworkAvailable(){ ConnectivityManager cm = (ConnectivityManager)MainActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] nwInfos = cm.getAllNetworkInfo(); for(NetworkInfo nwInfo : nwInfos){ System.out.println("network type name="+nwInfo.getTypeName()); System.out.println("network available="+nwInfo.isAvailable()); System.out.println("network c_or-c="+nwInfo.isConnectedOrConnecting()); System.out.println("network connected="+nwInfo.isConnected()); } }
以上資料大部分是從國外的StackOverflow上了解到的,而且我也均真正測試過,是好用的。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。