我刚刚扎根我的设备(已验证:),并安装了Linage 16(Android 9)。
之所以这样做,是因为我需要禁用移动网络,然后重新启用它才能从移动服务提供商那里获得新的新IP地址。所有这些都必须在应用本身内部自动完成。因此,对于我的特殊情况,手动断开连接和重新连接不是解决方案。
因此,我进行了一些研究,例如,我在这里发现了应该启用移动网络切换的功能:https://stackoverflow.com/a/31488730/1020704
这说明了如何请求root特权:https://stackoverflow.com/a/31488730/1020704
并且这里说明了如何正确设置Manifest.xml:https://stackoverflow.com/a/31488730/1020704
所以,我得到的是这样的:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" tools:ignore="ProtectedPermissions"/>
<application....
并且在我的代码中,我执行以下操作:
public void toggleMobileNetwork(boolean mobileDataEnabled) {
try {
Process root = Runtime.getRuntime().exec("su");
TelephonyManager telephonyService = (TelephonyManager) getSystemService(this.TELEPHONY_SERVICE);
Method setMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("setDataEnabled", boolean.class);
if (null != setMobileDataEnabledMethod) {
setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled);
}
} catch (Exception ex) {
ex.getCause().printStackTrace();
}
}
执行此代码时,出现以下异常:
W/System.err: java.lang.SecurityException: setUserDataEnabled
W/System.err: at android.os.Parcel.createException(Parcel.java:1950)
W/System.err: at android.os.Parcel.readException(Parcel.java:1918)
W/System.err: at android.os.Parcel.readException(Parcel.java:1868)
W/System.err: at com.android.internal.telephony.ITelephony$Stub$Proxy.setUserDataEnabled(ITelephony.java:4631)
W/System.err: at android.telephony.TelephonyManager.setDataEnabled(TelephonyManager.java:6453)
W/System.err: at android.telephony.TelephonyManager.setDataEnabled(TelephonyManager.java:6430)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.example.app.MainActivity.toggleMobileNetwork(MainActivity.java:51)
W/System.err: at com.example.app.MainActivity.disableMobileNetwork(MainActivity.java:41)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
所以,有人知道我在这里做什么?
好吧,在进行了一些额外的研究之后,我在这里找到了一种类似SO的替代解决方案,它的工作原理很像魅力。