Turn on / off mobile data (GPRS) using code

I had one solution to enable and disable data that worked well in APIs 8 and 10, but this code was not compatible with ICS, I need a global solution, so the same code must be compatible with API 8 before the Android OS version date .

+5
source share
4 answers

Use the following method. It will work with all versions of Android.

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

Required Permissions:

 <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 with Android L, this only works for system applications.

+18
source

This code works 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 ANDROIDMAINFEST.XML IN ANDROIDMAINFEST.XML

 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
+6
source

You also need this permission:

 <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/> 
+2
source
 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 is working with my case. Plz add permissions related to network changes

+2
source

Source: https://habr.com/ru/post/955950/


All Articles