24

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

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

4

15 回答 15

54

首先,我永远不会依赖在大多数答案中建议的盲目浏览 UI的解决方案。更多在下面的注释中。

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

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 可能会有所不同。我已经在 Samsung Galaxy S4(Android 6.0.1)上对其进行了测试,但它在那里不起作用。这可能是三星和默认用户界面之间的差异。

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

于 2016-10-26T20:14:07.633 回答
8

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

adb shell svc wifi disable

或者

adb shell svc wifi enable

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

于 2018-10-31T10:06:32.223 回答
4
adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
adb shell input keyevent 19 & adb shell input keyevent 23
于 2013-07-16T14:06:29.687 回答
4

仅适用于 Rooted 设备。.

开启飞行模式:

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
于 2018-04-30T13:07:04.510 回答
4

打开 APN 模式

adb shell settings put global airplane_mode_on 1

关闭 APN 模式

adb shell settings put global airplane_mode_on 0 

在 Android-L 上验证

于 2016-03-23T11:13:03.217 回答
4

关闭飞行模式:

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
于 2016-08-11T05:02:32.793 回答
4

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

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

于 2017-06-30T17:39:58.820 回答
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对我不起作用,找不到设置。

于 2014-05-01T17:46:12.273 回答
1

使用以下命令启动Settings > Wireless networks,切换飞行模式并返回(按返回):

  • 视窗/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) 上测试。

于 2014-01-11T09:10:59.257 回答
1

由于在 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

于 2018-03-02T18:31:59.733 回答
1

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

alias android:online="androidOfflineOnline enable"
alias android:offline="androidOfflineOnline disable"
function androidOfflineOnline {
   adb shell svc data $1
   adb shell svc wifi $1
}
于 2020-04-28T11:30:38.907 回答
1

威廉的答案是最适合我的答案-> 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";
于 2015-12-21T15:58:11.750 回答
0

如果手机已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'"

于 2019-07-16T18:28:21.940 回答
0

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

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将这个技巧留在上述答案的评论部分。

于 2020-07-03T17:06:44.697 回答
0

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

使用 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.");
    }
}
于 2019-03-27T23:10:32.757 回答