我看了一遍,我还没有找到这个问题的具体答案。我希望找到一种方法来从ADB切换飞机模式,不涉及任何方式的GUI。我找到并使用调用菜单的方法,然后使用keyevents打开飞行模式,但由于需要考虑UI布局的可能变化,此方法只是一个临时解决方案。
我开始认为没有办法只通过意图打开或关闭飞机模式,但如果你有任何信息,我会非常感激。
答案 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)
使用以下命令启动设置> 无线网络,切换飞行模式并返回(按返回):
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)上测试过。
答案 8 :(得分:1)
所以我让终端睡了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
答案 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用户访问权限,并且docs中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]
向David Ferenczy Rogožan致谢,他们把这个技巧留在了上述答案的评论部分。