我已经看遍了,我还没有找到这个问题的具体答案。我希望找到一种从 ADB 切换飞行模式的方法,它不以任何方式涉及 GUI。我找到并使用了调出菜单然后使用keyevents打开飞行模式的方法,但由于需要考虑UI布局可能发生的变化,这种方法只是一个临时解决方案。
我开始认为没有办法通过意图打开或关闭飞行模式,但如果您有任何信息,我将不胜感激。
我已经看遍了,我还没有找到这个问题的具体答案。我希望找到一种从 ADB 切换飞行模式的方法,它不以任何方式涉及 GUI。我找到并使用了调出菜单然后使用keyevents打开飞行模式的方法,但由于需要考虑UI布局可能发生的变化,这种方法只是一个临时解决方案。
我开始认为没有办法通过意图打开或关闭飞行模式,但如果您有任何信息,我将不胜感激。
首先,我永远不会依赖在大多数答案中建议的盲目浏览 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)上对其进行了测试,但它在那里不起作用。这可能是三星和默认用户界面之间的差异。
设置操作方法应该是完全安全的。
对于较新的 android,这会启用/禁用 wifi。不是你的任务,但我很乐意在这里找到它:
adb shell svc wifi disable
或者
adb shell svc wifi enable
adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
adb shell input keyevent 19 & adb shell input keyevent 23
仅适用于 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
打开 APN 模式
adb shell settings put global airplane_mode_on 1
关闭 APN 模式
adb shell settings put global airplane_mode_on 0
在 Android-L 上验证
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
这就是我能够在模拟器(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
但是,我见过几秒钟后模拟器自动重新连接的情况。
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
对我不起作用,找不到设置。
使用以下命令启动Settings > Wireless networks,切换飞行模式并返回(按返回):
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
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) 上测试。
由于在 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
在我的 .zshrc 文件中,我添加了它来模拟飞行模式。
alias android:online="androidOfflineOnline enable"
alias android:offline="androidOfflineOnline disable"
function androidOfflineOnline {
adb shell svc data $1
adb shell svc wifi $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";
如果手机已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'"
如果您具有 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将这个技巧留在上述答案的评论部分。
我在移动自动化框架中使用的一种工作方法:
使用 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.");
}
}