[英]How to enable airplane mode on android using adb
我有一部 android 手機,我想在其上以編程方式切換飛行模式。
我一直無法root此設備,這阻止了我正在運行的任何應用程序有權編輯這些設置,所以我使用adb打開設置菜單並在那里切換開關。
在某些情況下,執行以下 adb shell 命令會起作用:
//Get airplane mode settings menu
adb -s ${device} shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
//Hit enter (as many times as required)
adb -s ${device} shell input keyevent KEYCODE_ENTER
//Check the state of airplane mode to determine when successful
adb -s ${device} shell settings get global airplane_mode_on
但是,這僅在包含飛行模式開關的菜單是設置頁面上列出的第一個菜單選項時才有效,因為“android.settings.AIRPLANE_MODE_SETTINGS”只會導航到找到設置的菜單。 它不會對設置本身執行任何聚焦,因此以下按 Enter 的命令將按錯誤的設置。
如果使用這種方法,有沒有辦法只識別/聚焦飛機撥動開關,或者檢查哪個菜單項處於焦點狀態,以便可以迭代這些項目直到找到正確的項目?
此外,如果有一種方法可以在不需要將手機插入 PC 的情況下執行這些 adb 命令,那就太好了 - 即 adb 客戶端可以在手機本身上運行(然后欺騙自己認為它是一個連接的設備)。
最后 - 這里的最終目標只是按需以編程方式切換飛行模式(最終請求將由運行在 termux 應用程序中的 node.js 進程觸發)。 如果有更好的方法可以在不使用不需要 root 權限的 adb 的情況下實現這一點,這也可以。
以下是打開和打開飛行模式的 ADB 命令:
打開:
adb shell settings put global airplane_mode_on 1
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE
關掉:
adb shell settings put global airplane_mode_on 0
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE
我懷疑這是一個令人難以置信的利基要求,但如果有人對如何使用 adb 命令在無根 android 手機上切換飛行模式感興趣,其中 UI 飛行模式切換按鈕不是設置活動中的第一項...... 。 參見下文!
如前所述,加載包含飛行模式按鈕的屏幕:
adb shell am start -a android.settings.AIRPLANE_MODE_SETTINGS
現在查看當前的 state 的 UI:
adb shell uiautomator dump
adb pull /sdcard/window_dump.xml
可以檢查上面第一個命令的 STDOUT 以確定默認情況下將 uiautomator 轉儲發送到何處。
要導航設置菜單,請使用 DPAD UP/DOWN 鍵事件:
adb shell input keyevent KEYCODE_DPAD_DOWN
adb shell input keyevent KEYCODE_DPAD_UP
根據設備的不同,我發現使用上述選項會導致節點被選中或被聚焦。 可以解析 UI 轉儲的 output,並在 DOM 中搜索“node[selected=true]”或“node[focused=true]”,具體取決於設備使用的情況。 我最終會檢查node.attr('text').toUpperCase.contains('PLANE MODE')
何時檢查何時達到飛行模式設置,然后最終執行:
adb shell input keyevent KEYCODE_ENTER
激活開關。
目前,這涵蓋了我嘗試過的設備,但如果菜單中有很多滾動操作,性能就不是很好。 I'd be interested to know if there's a way to hold uiautomator dump output in memory on the device and parse the XML there to avoid unnecessary I/O of outputting to a file, pulling to a local drive and reading it back into memory there .
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.