Android 通過程式碼實現控制資料網路的開關(僅適用於5.0以上)
Android 5.0以前使用ConnectivityManager通過反射兩個方法setMobileDataEnabled和getMobileDataEnabled來控制行動網路開和關。 Android 5.0以後使用TelephonyMananger類通過反射獲取setDataEnabled和getDataEnabled類完成操作。 注意:需要使用系統許可權:android:sharedUserId=”android.uid.system”。
public void setMobileDataState(Context context, boolean enabled) { TelephonyManager telephonyService = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try { Method setDataEnabled = telephonyService.getClass().getDeclaredMethod("setDataEnabled",boolean.class); if (null != setDataEnabled) { setDataEnabled.invoke(telephonyService, enabled); } } catch (Exception e) { e.printStackTrace(); } }
public boolean getMobileDataState(Context context) { TelephonyManager telephonyService = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); try { Method getDataEnabled = telephonyService.getClass().getDeclaredMethod("getDataEnabled"); if (null != getDataEnabled) { return (Boolean) getDataEnabled.invoke(telephonyService); } } catch (Exception e) { e.printStackTrace(); } return false; } <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 自適應Android5.0以前及以後的程式碼:
TelephonyManager mTelephonyManager = (TelephonyManager)context .getSystemService(Context.TELEPHONY_SERVICE); ConnectivityManager mConnectivityManager =(ConnectivityManager)context .getSystemService(Context.CONNECTIVITY_SERVICE); 1 2 public void setDataEnable(){ Object object = Build.VERSION.SDK_INT >= 21 ? mTelephonyManager : mConnectivityManager; String methodName = Build.VERSION.SDK_INT >= 21 ? "setDataEnabled" : "setMobileDataEnabled"; Method setMobileDataEnable; try { setMobileDataEnable = object.getClass().getMethod(methodName, boolean.class); setMobileDataEnable.invoke(object, true); } catch (Exception e) { e.printStackTrace(); } } 1 2 3 4 5 6 7 8 9 10 11 public void checkConnectState(){ while(true){ Object object = Build.VERSION.SDK_INT >= 21 ? mTelephonyManager : mConnectivityManager; String methodName = Build.VERSION.SDK_INT >= 21 ? "getDataEnabled" : "getMobileDataEnabled"; Method getMobileDataEnable; boolean isDataEnabled = false; try { getMobileDataEnable = object.getClass().getMethod(methodName, null); isDataEnabled = (Boolean) getMobileDataEnable.invoke(object, null); } catch (Exception e) { e.printStackTrace(); } if(isDataEnabled){ break; }else{ sleep(200); } } }