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);
}
}
}