【问题标题】:Turning airplane mode on via ADB通过 ADB 开启飞行模式
【发布时间】:2012-05-08 21:12:52
【问题描述】:

我已经看遍了,我还没有找到这个问题的具体答案。我希望找到一种从 ADB 切换飞行模式的方法,它不以任何方式涉及 GUI。我找到并使用了调出菜单然后使用keyevents打开飞行模式的方法,但由于需要考虑UI布局可能发生的变化,这种方法只是一个临时解决方案。

我开始认为没有办法仅通过意图打开或关闭飞行模式,但如果您有任何信息,我将不胜感激。

【问题讨论】:

  • 你能接受查尔斯的任何答案吗(我猜 G 的答案是最好的)?它将帮助其他人更快地找到答案,并且还会产生一些其他后果(例如,如果该问题具有已接受的答案,您可以将此问题用作另一个问题的副本)。

标签: android


【解决方案1】:

首先,我永远不会像这里的大多数答案中所建议的那样依赖 盲目地在 UI 中导航的解决方案。更多内容请参见下方说明。

我喜欢 G壁画的第一个答案,它建议以下启用飞行模式:

adb shell settings put global airplane_mode_on 1

不幸的是,它不起作用。它只是改变了飞行模式图标的状态,但所有收音机仍然处于活动状态

它缺少一个非常重要的部分,即在设置更改后立即广播意图,以通知应用程序飞行模式状态已更改。

启用飞行模式,请使用以下命令:

adb shell settings put global airplane_mode_on 1
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE

禁用飞行模式,您必须将设置更改为 0 并再次广播意图:

adb shell settings put global airplane_mode_on 0
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE

它已在 Android 6 上测试并运行


注意

许多答案建议使用活动打开飞行模式设置,然后模拟一些按键以浏览 UI。 我不建议依赖它。设备上可能只有短暂的延迟,并且在打开设置对话框之前会按下按键,或者例如同时出现一些意外的对话框。在这两种情况下,按键都会导致一些意想不到的、可能有害的事情。

另外,不同品牌、型号、Android 版本等设备上的 UI 可能会有所不同。我在三星 Galaxy S4(Android 6.0.1)上测试过,但在那里无法正常工作。这可能是三星和默认 UI 之间的差异。

设置操作方法应该是绝对安全的。

【讨论】:

  • 这不起作用了,“Permission Denial: not allowed to send broadcast android.intent.action.AIRPLANE_MODE”
  • @GregEnnis 最好指定它不再起作用的设置,否则它是无用的信息。
  • 很好的解决方案,但在 Android 4.4.2 上对我不起作用
  • @DawidFerenczy 我在 Android 7.0 及更高版本上收到“权限被拒绝 - 不允许发送广播”。在三星 A5 和 S8 上测试
  • 我发现,如果你的手机已经root,你可以运行 $ adb shell "su -c 'settings put global plane_mode_on 1'" $ adb shell "su -c 'am broadcast -a android.intent .action.AIRPLANE_MODE'"
【解决方案2】:

对于较新的 android,这会启用/禁用 wifi。不是你的任务,但我很乐意在这里找到它:

adb shell svc wifi disable

adb shell svc wifi enable

归功于这个答案:https://stackoverflow.com/a/27228962/1021872

【讨论】:

  • 这对我的安卓模拟器没有任何作用。
【解决方案3】:
adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
adb shell input keyevent 19 & adb shell input keyevent 23

【讨论】:

  • 我是否正确假设您在第二次 adb 调用之前错过了一个分号?你真的想同时运行两个键事件吗?这对我不起作用,“InputDispatcher: Dropped event because input dispatch is disabled.”
  • 在 2.3.3 上工作,但没有并行运行它们。所以用分号; 替换& 或将它们放在单独的行中。它也可以在没有 keyevent 19 的情况下工作
【解决方案4】:

开启 APN 模式

adb shell settings put global airplane_mode_on 1

关闭 APN 模式

adb shell settings put global airplane_mode_on 0 

在 Android-L 上验证

【讨论】:

  • 这显示了已启用飞行模式的图标,但互联网连接仍处于启用状态。
  • 此解决方案不起作用。它缺少一个重要的部分。详情请见my answer
【解决方案5】:

关闭飞行模式:

if [[ "$(adb shell dumpsys wifi | grep mAirplaneModeOn)" == "mAirplaneModeOn true" ]]; then  

    adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
        && input keyevent 19
        && input keyevent 23
        && input keyevent 4
fi

开启飞行模式:

if [[ "$(adb shell dumpsys wifi | grep mAirplaneModeOn)" == "mAirplaneModeOn false" ]]; then            

    adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
        && input keyevent 19
        && input keyevent 23
        && input keyevent 4
fi

【讨论】:

    【解决方案6】:

    这就是我能够在 emulator (API 25) 上启用飞行模式以克服权限问题的方法。

    adb -s emulator-5554 shell settings put global airplane_mode_on 1
    adb -s emulator-5554 shell 'su 0 am broadcast -a android.intent.action.AIRPLANE_MODE'
    

    请注意,您的“su 0”可能会有所不同。例如,对于较旧的 api,我必须使用 'su &'

    如果您只想禁用模拟器上的数据,请使用

    svc data disable
    

    但是,我见过 emulator 在几秒钟后自动重新连接的情况。

    【讨论】:

    • 如何找到正确的 'su' ? 'su 0' 和 'su &' 我都试过了,但它们都不起作用。
    【解决方案7】:

    仅适用于 Root 设备。

    开启飞行模式:

    adb shell -c settings put global airplane_mode_on 1
    adb shell -c am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
    

    关闭飞行模式:

    adb shell -c settings put global airplane_mode_on 0
    adb shell -c am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false
    

    【讨论】:

      【解决方案8】:

      adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS & adb shell input keyevent KEYCODE_ENTER & adb shell input keyevent 4

      将切换飞行模式。但是,有谁知道是否有办法明确取消选中或选中该框?问题是我找不到在切换之前检查状态的方法。 adb shell settings get global airplane_mode_on 对我不起作用,找不到设置。

      【讨论】:

      • 在三星 Galaxy S5 上什么都不做
      【解决方案9】:

      使用以下命令启动设置 > 无线网络,切换飞行模式并返回(按返回键):

      • Windows/DOS: adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS & adb shell input keyevent 19 & adb shell input keyevent 23 & adb shell input keyevent 4
      • Unix/Linux: adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS ; adb shell input keyevent 19 ; adb shell input keyevent 23 ; adb shell input keyevent 4

      在三星 Galaxy S (Android OS 2.3.3) 上测试。

      【讨论】:

        【解决方案10】:

        william 的answer 是最适合我的-> Android 5.0 Lollipop。 但是,有时它不会切换,因为它试图在设置活动完全加载之前切换。

        所以我让终端休眠了 0.1 秒。我添加了点击后退退出设置

        adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
        adb shell input keyevent 19 ; sleep 0.1; adb shell input keyevent 23; sleep 0.3; adb shell input keyevent 4;
        echo "Toggled airplane mode";
        

        【讨论】:

        • 这真的很糟糕,因为它依赖于 UI 及其行为。出现小延迟或出现意外对话框,您被搞砸了(或您的设备被搞砸了)。我永远不会依赖它。有更简洁的方法可以实现这一目标。
        【解决方案11】:

        由于在 Nougat 之后广播命令停止工作,我建议使用如下内容:

        adb shell "input keyevent KEYCODE_WAKEUP;input keyevent KEYCODE_MOVE_HOME;am start -a android.settings.AIRPLANE_MODE_SETTINGS;sleep 0.5;input keyevent KEYCODE_ENTER;pm clear com.android.settings;input keyevent KEYCODE_HOME"
        

        这适用于三星 S7

        【讨论】:

          【解决方案12】:

          在我的 .zshrc 文件中,我添加了这个来模拟飞行模式。

          alias android:online="androidOfflineOnline enable"
          alias android:offline="androidOfflineOnline disable"
          function androidOfflineOnline {
             adb shell svc data $1
             adb shell svc wifi $1
          }
          

          【讨论】:

            【解决方案13】:

            我在移动自动化框架中使用的一种工作方法:

            使用 OS 5.x 6.x 7.x 和 8.x 需要针对 9.x 进行测试

            /**
             * Method to set Android device Airplane mode.
             * 
             * @param status
             * 
             *               true - turn on airplane mode false - turn off airplane mode
             */
            public static void setAndroidDeviceAirplaneMode(boolean status) {
                try {
            
                    String airplaneModeStatus = "";
                    if (status) {
                        airplaneModeStatus = "0";
                    } else {
                        airplaneModeStatus = "0";
                    }
                    String sdkPath = System.getenv("ANDROID_HOME") + "/platform-tools/";
                    Runtime.getRuntime().exec(sdkPath + "adb shell settings put global airplane_mode_on " + airplaneModeStatus);
                    Thread.sleep(1000);
                    Process process = Runtime.getRuntime()
                            .exec(sdkPath + "adb shell am broadcast -a android.intent.action.AIRPLANE_MODE");
                    process.waitFor();
                    Thread.sleep(4000);
                    if (status) {
                        logger.info("Android device Airplane mode status is set to ON");
                    } else {
                        logger.info("Android device Airplane mode status is set to OFF");
                    }
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                    logger.error("Unable to set android device Airplane mode.");
                }
            }
            

            【讨论】:

              【解决方案14】:

              如果手机已root,则可以使用此命令。此外,如果使用 Magisk,shell 必须获得“su”权限

              启用飞行模式

              adb -s ZY32234G3V shell "su -c 'input keyevent KEYCODE_WAKEUP;input keyevent KEYCODE_MOVE_HOME;settings put global plane_mode_on 1;am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true'"

              禁用飞行模式

              adb -s ZY32234G3V shell "su -c 'input keyevent KEYCODE_WAKEUP;input keyevent KEYCODE_MOVE_HOME;settings put global plane_mode_on 0;am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false'"

              【讨论】:

                【解决方案15】:

                如果您有 root 访问权限,并且 David Ferenczy Rogožan 中的 the answer 中的方法给您留下了安全异常:

                Permission Denial: not allowed to send broadcast android.intent.action.AIRPLANE_MODE
                

                您可以尝试以超级用户身份运行命令,如下所示。

                启用飞行模式

                adb shell "su -c 'settings put global airplane_mode_on 1'"
                adb shell "su -c 'am broadcast -a android.intent.action.AIRPLANE_MODE'"
                

                禁用飞行模式

                adb shell "su -c 'settings put global airplane_mode_on 0'"
                adb shell "su -c 'am broadcast -a android.intent.action.AIRPLANE_MODE'"
                

                根据我使用 Android 9 的经验,su 的显式调用仅对广播命令是必需的,而对于前者我可以保留:

                adb shell settings put global airplane_mode_on [0|1]
                

                感谢Arya 将这个技巧留在上述答案的评论部分。

                【讨论】:

                  【解决方案16】:

                  这对我有用:

                  adb shell settings put global airplane_mode_on 1
                  adb shell su -c am broadcast -a android.intent.action.AIRPLANE_MODE
                  

                  要关闭,只需在第一个命令中传递 0。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-12-12
                    • 1970-01-01
                    相关资源
                    最近更新 更多