我试图在特定时刻enable/disable
移动数据。我已经在MotoG 4.4.2 (Rooted)
上尝试了它,我没有问题,但是当我在Samsung Galaxy Grand Prime 4.4.4 (No Root)
上尝试它时,它不起作用,我也是&#39已经在Samsung Galaxy S3 4.3 (No Root)
上尝试了它,但它确实有效。
我尝试的代码是:
public void GetDataConnectionAPI() {
this.context.getApplicationContext();
TelephonyManager telephonyManager =
(TelephonyManager) this.context.getApplicationContext().
getSystemService(Context.TELEPHONY_SERVICE);
try {
telephonyManagerClass = Class.forName(telephonyManager.getClass().getName());
Method getITelephonyMethod = telephonyManagerClass.getDeclaredMethod("getITelephony");
getITelephonyMethod.setAccessible(true);
ITelephonyStub = getITelephonyMethod.invoke(telephonyManager);
ITelephonyClass = Class.forName(ITelephonyStub.getClass().getName());
dataConnSwitchmethod_OFF =
ITelephonyClass.getDeclaredMethod("disableDataConnectivity");
dataConnSwitchmethod_ON = ITelephonyClass.getDeclaredMethod("enableDataConnectivity");
} catch (Exception e) {
e.printStackTrace();
}
}
然后我用这种方法启用/禁用数据:
public void setMobileDataEnabled(Context context, boolean enabled) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final Class conmanClass = Class.forName(conman.getClass().getName());
final Field connectivityManagerField = conmanClass.getDeclaredField("mService");
connectivityManagerField.setAccessible(true);
final Object connectivityManager = connectivityManagerField.get(conman);
final Class connectivityManagerClass = Class.forName(connectivityManager.getClass().getName());
final Method setMobileDataEnabledMethod = connectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
setMobileDataEnabledMethod.setAccessible(true);
setMobileDataEnabledMethod.invoke(connectivityManager, enabled);
}
当我想启用时,我调用此方法:
public void EnableMobileData(){
try {
setMobileDataEnabled(context, true);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
在我的清单上,我把
<!-- 3g uses-permisions-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
我想知道是否有可能避免这种对话或只是以编程方式接受它。
我已经阅读了Bojan Kogoj answer这就是我所说的:
- 预先安装到ROM上的系统文件夹中
- 由制造商使用其安全证书编制
但我想知道是否有其他办法可以做到这一点。
答案 0 :(得分:3)
MODIFY_PHONE_STATE
权限不保证在所有情况下均可使用。默认情况下,它是系统级权限,因此它仅适用于制造商已启用它的设备。
类似地,像getITelephony()
这样的方法是特定于设备/制造商的,并且无法在每个设备上获取这样做的方法的名称。
不幸的是,没有保证可以做到这一点。