代码之家  ›  专栏  ›  技术社区  ›  jdowdell

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

  •  0
  • jdowdell  · 技术社区  · 7 年前

    在阅读了一堆过时的指南和堆栈溢出之后,我能够用usb adb将apk作为系统应用程序安装到中 /system/priv-app

    // 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

    我做错了什么?我希望通过System.putInt()打开飞机模式与点击状态栏中的飞机模式互动程序具有相同的效果。当我执行代码时,没有异常或有用的错误信息泄漏到logcat。

    2 回复  |  直到 7 年前
        1
  •  0
  •   jonathanrz    7 年前

    检查这个 answer

    广播内容应为:

    Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
    intent.putExtra("state", < current value of the airplane mode >);
    sendBroadcast(intent);
    
        2
  •  0
  •   jdowdell    7 年前

    除了上面jonathanrz的附加代码(我相信它更接近canonical),我发现以下代码代替了 Settings.System.putInt() 代码,不需要发送意图(或添加发送意图所需的权限),至少在Oreo上是这样。我通过合并其他帖子中的一些答案和即兴评论创建了它,特别是一个答案草图,隐藏在网站上“Navas pk”的评论中 Toggle airplane mode in Android

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