通过ADB打开飞机模式

时间:2012-05-08 21:12:52

标签: android

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

我开始认为没有办法只通过意图打开或关闭飞机模式,但如果你有任何信息,我会非常感激。

15 个答案:

答案 0 :(得分:33)

首先,我绝不会依赖于盲目浏览UI 的解决方案,正如大多数答案所示。更多内容见下文。

我喜欢G murali的第一个答案,它建议以下方式启用飞机模式:

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版本等设备上的用户界面也可能不同。我在三星Galaxy S4(Android 6.0.1)上测试过它并没有在那里工作。它可能是三星和默认用户界面之间的差异。

设置操作方法应该非常安全。

答案 1 :(得分:6)

开启APN模式

adb shell settings put global airplane_mode_on 1

关闭APN模式

adb shell settings put global airplane_mode_on 0 

在Android-L上验证

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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对我不起作用,找不到设置。

答案 4 :(得分:3)

这就是我能够在模拟器(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

但是,我已经看到模拟器在几秒钟后自动重新连接的情况。

答案 5 :(得分:2)

关闭飞行模式:

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

打开飞行模式:

demo()

答案 6 :(得分:2)

仅适用于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

答案 7 :(得分:1)

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

  • 在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)上测试过。

答案 8 :(得分:1)

威廉的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";

答案 9 :(得分:1)

对于较新的android,此功能可禁用wifi。并不是您的任务,但是我很乐于在这里找到它:

adb shell svc wifi disable

adb shell svc wifi enable

信用证回答如下:https://stackoverflow.com/a/27228962/1021872

答案 10 :(得分:1)

在我的.zshrc文件中,我添加了它以模拟飞行模式。

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

答案 11 :(得分:0)

由于广播命令在Nougat之后停止工作,我建议使用这样的东西:

adb shell“输入keyevent KEYCODE_WAKEUP;输入keyevent KEYCODE_MOVE_HOME; am start -a android.settings.AIRPLANE_MODE_SETTINGS; sleep 0.5;输入keyevent KEYCODE_ENTER; pm clear com.android.settings;输入keyevent KEYCODE_HOME”

适用于Samsung S7

答案 12 :(得分:0)

我在Mobile Automation Framework中使用的一种工作方法:

  

使用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.");
    }
}

答案 13 :(得分:0)

如果手机已扎根,则可以使用此命令。另外,如果使用Magisk,则必须授予外壳“ su”权限

启用飞行模式

adb -s ZY32234G3V shell“ su -c'输入keyevent KEYCODE_WAKEUP;输入keyevent KEYCODE_MOVE_HOME;设置将globalplane_mode_on设置为1;广播-a android.intent.action.AIRPLANE_MODE --ez状态为true'”

禁用飞行模式

adb -s ZY32234G3V shell“ su -c'输入keyevent KEYCODE_WAKEUP;输入keyevent KEYCODE_MOVE_HOME;设置将globalplane_mode_on设置为0;上午广播-a android.intent.action.AIRPLANE_MODE --ez状态为false'”

答案 14 :(得分:0)

如果您具有root用户访问权限,并且docsthe 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]

David Ferenczy Rogožan致谢,他们把这个技巧留在了上述答案的评论部分。