Enable/Disable Mobile Data (GPRS) using code

前端 未结 4 1608

I was having one solution for enabling and disabling data that was working good in API 8 and 10, but that code was not compatible with the ICS, I need a global solution, so

相关标签:
4条回答
  • 2020-12-09 14:21

    This code running in android gingerbread and higher:

    private void setMobileDataEnabled(Context context, boolean enabled) {
       final ConnectivityManager conman = (ConnectivityManager)  context.getSystemService(Context.CONNECTIVITY_SERVICE);
       final Class conmanClass = Class.forName(conman.getClass().getName());
       final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
       iConnectivityManagerField.setAccessible(true);
       final Object iConnectivityManager = iConnectivityManagerField.get(conman);
       final Class iConnectivityManagerClass =  Class.forName(iConnectivityManager.getClass().getName());
       final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
       setMobileDataEnabledMethod.setAccessible(true);
    
       setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
    }
    

    NOTE: U MUST ADD THIS BELOW LINE IN ANDROIDMAINFEST.XML

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    
    0 讨论(0)
  • 2020-12-09 14:31

    You also need that permission:

    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
    
    0 讨论(0)
  • 2020-12-09 14:32

    Use the following method. It'll work with all android versions.

    int bv = Build.VERSION.SDK_INT;
    
    boolean turnOnDataConnection(boolean ON,Context context)
     {
    
         try{
          if(bv == Build.VERSION_CODES.FROYO)
    
             {
              Method dataConnSwitchmethod;
                Class<?> telephonyManagerClass;
                Object ITelephonyStub;
                Class<?> ITelephonyClass;
    
                TelephonyManager telephonyManager = (TelephonyManager) context
                        .getSystemService(Context.TELEPHONY_SERVICE);
    
                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) {
                    dataConnSwitchmethod = ITelephonyClass
                            .getDeclaredMethod("enableDataConnectivity");
                } else {
                    dataConnSwitchmethod = ITelephonyClass
                            .getDeclaredMethod("disableDataConnectivity");   
                }
                dataConnSwitchmethod.setAccessible(true);
                dataConnSwitchmethod.invoke(ITelephonyStub);
    
               }
             else
               {
                 //log.i("App running on Ginger bread+");
                 final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                 final Class<?> conmanClass = Class.forName(conman.getClass().getName());
                 final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
                 iConnectivityManagerField.setAccessible(true);
                 final Object iConnectivityManager = iConnectivityManagerField.get(conman);
                 final Class<?> iConnectivityManagerClass =  Class.forName(iConnectivityManager.getClass().getName());
                 final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
                 setMobileDataEnabledMethod.setAccessible(true);
                 setMobileDataEnabledMethod.invoke(iConnectivityManager, ON);
               }
    
    
             return true;
         }catch(Exception e){
                            Log.e(TAG,"error turning on/off data");
    
                            return false;
                            }
    
     }
    

    Permissions Required:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    

    UPDATE:

    Starting from Android L this works only for System applications

    0 讨论(0)
  • 2020-12-09 14:35
    private static boolean enableMobileData(Context context, boolean enable) {
        boolean bool = true;
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        try {
            Class[] arrayOfClass = new Class[1];
            arrayOfClass[0] = Boolean.TYPE;
            Method enableDataMethod = ConnectivityManager.class.getMethod("setMobileDataEnabled", arrayOfClass);
            DailySchedulerLog.v("Method enableDataMethod = %s", enableDataMethod.getName());
            Object[] arrayOfObject = new Object[1];
            arrayOfObject[0] = Boolean.valueOf(enable);
            enableDataMethod.invoke(cm, arrayOfObject);
            return bool;
        } catch (Exception localException) {
            //            while (true) {
            DailySchedulerLog.d("Exception !!!!!!!!! loops");
            return bool = false;
            //            }
        }
    }
    

    this snipcode works with my case. Plz, add permissions related to change network

    0 讨论(0)
提交回复
热议问题