通过ADB打开飞行模式

33

我已经四处寻找,但没有找到确切的答案。我希望能找到一种不需要GUI界面的通过ADB切换飞行模式的方法。我已经找到了一种调用菜单然后使用键盘事件开启飞行模式的方法,但由于需要考虑可能会发生的UI布局变化,这种方法只是一个临时解决方案。

我开始觉得没有办法通过意图(intent)来简单地切换飞行模式的开关,但如果你有任何信息,我将非常感激。


你可以查看这个链接https://dev59.com/SHnZa4cB1Zd3GeqPp2wN#26906472 - Anand
3
请问您能接受查尔斯的任何答案吗?(我猜G的答案最好?)这将有助于其他人更快地找到答案,也会产生一些其他后果(例如,您可以使用该问题作为另一个问题的重复,如果它有被接受的答案)。 - David Ferenczy Rogožan
对于最新的设备,例如Android 13,请参考wuseman的回答,使用adb shell cmd connectivity airplane-mode enable命令。 - nealmcb
18个回答

60

首先,我永远不会依赖那些像大多数答案建议的那样盲目地通过 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界面。 我不建议这样做。设备可能会有短暂的延迟,而在打开设置对话框之前就进行了按键操作,或者例如在此期间会出现一些意外的对话框。 在这两种情况下,按键操作将导致某些意外的行为,可能会有害。

并且UI界面可能因品牌、型号、Android版本等而异。 我在三星Galaxy S4(Android 6.0.1)上进行了测试,但没有起作用。这可能是三星与默认UI之间的差异。

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

---2022年10月更新 如果您遇到有关安全设置的错误,请使用以下最佳解决方案: 移动数据:adb shell svc data disable wifi:adb shell svc wifi disable


25
无法使用,提示“权限拒绝:不允许发送广播android.intent.action.AIRPLANE_MODE”。 - Greg Ennis
@GregEnnis 如果不指明它在哪个设置上不再工作,否则这是无用的信息。 - David Ferenczy Rogožan
6
在Android 7.0及以上版本中,我遇到了“权限拒绝-不允许发送广播”的问题。此问题已在三星A5和S8上进行过测试。 - Jack Dewhurst
3
如果你的手机已经获取了 root 权限,你可以运行以下命令:$ adb shell "su -c 'settings put global airplane_mode_on 1'"$ adb shell "su -c 'am broadcast -a android.intent.action.AIRPLANE_MODE'"这些命令可以将手机设置为飞行模式。请注意,执行这些操作需要了解 Android 系统和 root 权限的知识,并且可能会在一些设备上造成不可逆转的损坏。 - Arya
无法在Android 7上运行:java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.AIRPLANE_MODE from pid=13094, uid=2000 - undefined
显示剩余12条评论

20

最近的Android版本使用cmd:

获取飞行模式

adb shell cmd connectivity airplane-mode                                                  
disabled

开启/关闭飞行模式

adb shell cmd connectivity airplane-mode enable                     
adb shell cmd connectivity airplane-mode disable 

2
在Android 11上完美运行! - z3ntu
1
虽然另一个答案(svc data enable|disable)仅仅是打开或关闭数据,而不改变移动电台的功率,但这个命令实际上会断开无线电连接。 - baum
1
适用于Android 13的。 - l3est
Android 7: 无外壳命令实现。 - undefined

12

对于较新的安卓系统,这个开关可以切换WiFi。虽然这不是你的任务,但我很高兴在这里找到它:

adb shell svc wifi disabled

或者

adb shell svc wifi enabled

功劳归于这个答案


1
这对我的Android模拟器没有任何作用。 - Nisim Naim
可能会出现错误,请参见此答案 - user598527

5

以下是我如何在模拟器(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

然而,我曾见过一些情况下,模拟器会在几秒钟后自动重新连接。

1
如何找到正确的“su”?我尝试过“su 0”和“su&”,但它们都不起作用。 - Hoang Minh
2
su 命令只在 已 root 的设备 上有效。 - Lafftar
^ 命令在使用模拟器时对我有效。唯一需要做的额外步骤是重新启动模拟器("adb reboot bootloader")。然后一切按预期工作。 - Austin

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

KEYCODE_ENTER比数字值更好。 - undefined

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

我猜你在第二个adb调用之前漏了一个分号,对吗?你真的想要同时运行这两个keyevents吗?这对我来说没用,“InputDispatcher: Dropped event because input dispatch is disabled.” - Michael
在2.3.3上工作,但不要并行运行它们。因此,将“&”替换为分号“;”或将它们放在单独的行中。没有keyevent 19也可以正常工作。 - polym
KEYCODE_ENTER比数字值更好。 - undefined

4

只针对已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

4

在我的 .zshrc 文件中,我添加了以下内容来模拟飞行模式。

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

我正在寻找这个!它可以切断互联网连接,谢谢。 - crgarridos

3
打开APN模式
adb shell settings put global airplane_mode_on 1

关闭APN模式
adb shell settings put global airplane_mode_on 0 

已在Android-L上验证过


8
这显示了飞行模式启用的图标,但是互联网连接仍然可用。 - levi
1
这个解决方案不可行。缺少一个重要的部分。详情请查看我的回答 - David Ferenczy Rogožan

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 命令无法使用,因为无法找到设置。


在三星Galaxy S5上不起作用。 - zgoda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接