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 that the same code must be compatible from API 8 to till date Android OS versions.
Asked
Active
Viewed 2.0k times
3 Answers
18
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

JiTHiN
- 6,548
- 5
- 43
- 69
-
1And I am getting error in 3 lines below 1) final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService"); Error is : Cannot convert from field to Dataformat.field..and Sugsession is change typ of iconnectvitymrgfield to field – Caution Continues Nov 23 '12 at 05:31
-
I solved that error..........Thanks A lot dear...This was very cool solution...:) – Caution Continues Nov 23 '12 at 05:44
-
I accept That your answer was very helpful and I have voted you, Anything else I can do for you....? – Caution Continues Nov 23 '12 at 05:45
-
One more question is here http://stackoverflow.com/questions/13523697/how-many-ways-we-can-find-cell-phone-location please help me. – Caution Continues Nov 23 '12 at 05:47
-
Dear I am new to StackOverflow....I guess I have done that....you talking about that icon like nike logo right...???? – Caution Continues Nov 23 '12 at 08:51
-
I have this code and it work perfectly fine and upvoted for your answer ,Although this solution do not work in dual sim mobile. any work around on it.. Also can you put explanatory comments to your magic code. Thank You @rIHaNJiTHiN , I really appreciate your effort. – sandeep_jagtap Feb 05 '14 at 19:34
2
You also need that permission:
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>

tiagoMissiato
- 305
- 3
- 16
2
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

Albert Nguyen
- 311
- 3
- 6