1. 程式人生 > >Android 通過程式碼實現控制資料網路的開關(僅適用於5.0以上)

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