为什么不切换飞行模式也会同时切换Wifi /蜂窝状态(Oreo)?

时间:2019-01-05 10:02:55

标签: android

在阅读了许多过时的指南和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

重新启动后,该应用已安装,我可以正常运行它。

我在通知抽屉/状态栏中检查开始时的情况:

Notifications Drawer screenshot - begin

然后我在应用程序中单击我的按钮,并检查会发生什么情况:

enter image description here

如您所见,根据飞行模式图标的状态,似乎成功启用了飞行模式。但是wifi和蜂窝数据仍继续连接,并且状态栏不会将文本“ Android”替换为“ Airplane mode”。在这种状态下,如果我跳到chrome,则可以清楚地加载以前从未访问过的网站。因此,实际上似乎并没有启用飞行模式。

我在做什么错?我希望通过System.putInt()启用飞行模式与点击状态栏中的飞行模式图块具有相同的效果。当我执行代码时,没有异常或有用的错误信息随处可见。

2 个答案:

答案 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();
    }
}