最近在做mobile data on/off的功能,可能我說mobile data大家沒什么概念,但是我如果說wifi on/off大家一定知道,而且也曉得如何去實現,mobile data其實就是我們不用wifi的時候,用自己手機里的SIM卡上網流量,即那個數據交換的開關。
這部分對我來說其實也是陌生的地方,不過通過上網查資料,也逐漸了解了一些,下面跟大伙分享一下:
實現這個功能,我們需要根據Android系統的版本將其分成兩個階段,分別實現。
在2.3版本以下,我們需要用所謂的Java反射機制去實現
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()); } }
使用時直接調用上面的函數,參數列表true/false分別代表開/關。不過2.3版本以下此功能有一個限制,就是必須在手動將數據交換圖標點亮后,才能去控制mobile data的on/off,而且,就是在off之后,數據交換圖標還是亮著的狀態,不過這個時候上不了網罷了,但是如果你不亮開數據交換圖標,再怎么調用也還是沒有用的。
在2.3版本及以上的Android系統中,可以使用 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); }
使用時也是直接調用就可以,context傳入的是當前activity的對象,enabled傳入true/false,控制開關。
以上兩個方法就是針對 mobile data on/off的實現,大家不要忘記需要在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"> </uses-permission>
此權限。
說到這就順便把如何查看當前設備的網絡連接跟大伙說一下,因為通常這些都是配套使用的。
//檢查當前的網絡狀態 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已經打開 if(wifiinfo.isConnected()) { //wifi已經連接上 } else { //wifi可用,但是沒有進行連接 } } else { //如果wifi為關閉狀態 } if(mobileinfo != null && mobileinfo.isAvailable()) { //移動數據連接 可用 if(mobileinfo.isConnected()) { //移動數據已經連接 } else { //移動數據未連接 } } else { //說明該設備并沒有移動數據連接功能 } }
上面的方法是判斷wifi連接還是正常的移動數據連接
還有一種方法就是比較全的,可以把所有的與當前設備連接或可以使用的網絡顯示出來
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上了解到的,而且我也均真正測試過,是好用的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。