我有一个用于启用和禁用在 API 8 和 10 中运行良好的数据的解决方案,但该代码与 ICS 不兼容,我需要一个全局解决方案,以便相同的代码必须与 API 8 迄今为止兼容安卓操作系统版本。
问问题
19539 次
4 回答
18
使用以下方法。它适用于所有安卓版本。
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;
}
}
所需权限:
<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"/>
更新:
从 Android L 开始,这仅适用于系统应用程序
于 2012-11-23T05:24:03.843 回答
6
此代码在 android 姜饼及更高版本中运行:
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);
}
注意:你必须在下面添加这个ANDROIDMAINFEST.XML
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
于 2012-11-23T05:20:26.293 回答
2
您还需要该权限:
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>
于 2013-01-24T12:59:07.910 回答
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;
// }
}
}
这个snipcode适用于我的情况。请添加与更改网络相关的权限
于 2015-02-28T04:15:52.737 回答