在阅读了许多过时的指南和stackoverflows之后,我得以使用USB ADB在/system/priv-app
中将apk安装为系统应用程序,从而成功切换了Android oreo中的AirplaneMode:
// method in Activity, called via click listener on a Button
private void setMobileRadioEnabled_Option1(boolean enabled) {
android.content.Context context = this;
int value = enabled ? 0 : 1;
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
Settings.System.putInt(
context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, value);
} else {
Settings.Global.putInt(
context.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, value);
}
}
AndroidManifest.xml中的权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
通过自定义签名密钥在AndroidStudio中构建的标准版本,可通过以下方式安装:
adb root
adb remount
adb push app-release.apk /system/priv-app
adb shell chmod 644 /system/priv-app/app-release.apk
adb reboot
重新启动后,该应用已安装,我可以正常运行它。
我在通知抽屉/状态栏中检查开始时的情况:
然后我在应用程序中单击我的按钮,并检查会发生什么情况:
如您所见,根据飞行模式图标的状态,似乎成功启用了飞行模式。但是wifi和蜂窝数据仍继续连接,并且状态栏不会将文本“ Android”替换为“ Airplane mode”。在这种状态下,如果我跳到chrome,则可以清楚地加载以前从未访问过的网站。因此,实际上似乎并没有启用飞行模式。
我在做什么错?我希望通过System.putInt()启用飞行模式与点击状态栏中的飞行模式图块具有相同的效果。当我执行代码时,没有异常或有用的错误信息随处可见。
答案 0 :(得分:0)
检查此answer似乎您需要发送广播,以通知您更改了飞行模式。
广播应为:
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", < current value of the airplane mode >);
sendBroadcast(intent);
答案 1 :(得分:0)
除了上述jonathanrz的其他代码(我认为它更接近规范)之外,我发现以下代码代替了Settings.System.putInt()
代码,并且不需要发送意图(或添加必要的许可)至少在奥利奥(Oreo)上发送。我是通过合并其他帖子中的一些答案和附带评论来创建的,特别是隐藏在Toggle airplane mode in Android上的“ Navas pk”评论中的答案草图:
private void setMobileRadioEnabled_Option2(boolean enabled) {
try {
final ConnectivityManager mConnectivityManager = (ConnectivityManager) getSystemService(android.content.Context.CONNECTIVITY_SERVICE);
final Class mClass = Class.forName(mConnectivityManager.getClass().getName());
final Method setAirplaneMode = mClass.getDeclaredMethod("setAirplaneMode", Boolean.TYPE);
setAirplaneMode.setAccessible(true);
setAirplaneMode.invoke(mConnectivityManager, !enabled);
} catch (Exception e) {
e.printStackTrace();
}
}