Фон:
Я использую автоматические тесты на многих различных вариантах устройств ( планшеты и смартфоны Samsung, такие как Galaxy A5, S8, S7 и т. д. ), где устройства имеют разные версии Android ( 6.0, 6.0.1, 7.0 и 7.1.1 ) - все в разных сочетаниях.
Некоторые из моих тестов требуют блокировки экрана (его выключения), а затем его включения и ввода PIN-кода. Мне не удалось найти (универсальную) команду adb для получения состояния телефонов. В идеале я хотел бы, чтобы одна команда сообщала мне, в каком из следующих состояний находится телефон:
Мое лучшее решение на данный момент - использовать следующие 2 команды (терминал bash):
#1:
adb shell dumpsys display | grep "mScreenState"
#2:
adb shell service call trust 7
Команда № 1 сообщает мне, включен ли экран, выключен или «дремлет».
Команда №2 сообщает мне, заблокирован или разблокирован телефон.
Вопросы:
Есть ли одна команда adb, которая может дать мне нужную информацию? Совместима ли эта команда с перечисленными выше версиями Android?
В Android версии 6.* команда №2 всегда указывает, что телефон заблокирован. Что такое «совместимая с Android 6. *» альтернатива команде № 2? ----> По чистой случайности я обнаружил, что «service call trust 6 » работает должным образом на устройствах Android 6.*
Примечание:
Ресурс, который, как я обнаружил, наиболее похож на мою проблему, - это следующий вопрос/ответ SO . Однако не все устройства имеют/используют NFC, поэтому следующая команда (хотя и совместимая с большинством устройств/версий) неприемлема в моих тестах:
adb shell dumpsys nfc | grep 'mScreenState='
Поскольку время является проблемой, предлагаемое решение (лучший ответ в ссылке) также неприемлемо.
Я фанат Windows, поэтому решение содержит find
вместо использования grep
просто заменить find на grep.
adb shell dumpsys power | find "mWakefulness="
adb shell dumpsys power | find "mHoldingWakeLockSuspendBlocker="
Экран выключен и заблокирован = mWakefulness = спящий режим и mHoldingWakeLockSuspendBlocker = false
Экран включен и заблокирован = mWakefulness = бодрствование и mHoldingWakeLockSuspendBlocker = false
Экран включен и разблокирован = mWakefulness = бодрствование и mHoldingWakeLockSuspendBlocker = true
PS: я тестировал его на Android 7.0 , не знаю, будет ли он работать с другими версиями.
Поскольку я столкнулся с этим недавно и поскольку использование экрана блокировки Daydream не является обязательным требованием для Android, вот несколько новых переменных, которые (вероятно) универсальны.
Они должны быть доступны начиная с Android M (6.0/API 23), поскольку они поставляются с режимом Doze; Я подтвердил их с Android 10 на Samsung Galaxy Tab S4 и Android 12 на Pixel 4 XL.
$ adb shell dumpsys deviceidle | grep '\bm[A-Z]'
mLightEnabled=true mDeepEnabled=true
mForceIdle=false
mUseMotionSensor=true mMotionSensor={Sensor name="Significant Motion", vendor="Google", version=1, type=17, maxRange=1.0, resolution=1.0, power=0.25, minDelay=-1}
mScreenOn=false
mScreenLocked=true
mNetworkConnected=true
mCharging=false
mMotionActive=true
mNotMoving=false
mMotionListener.activatedTimeElapsed=36192
mLastMotionEventElapsed=0
mLocating=false mHasGps=false mHasNetwork=false mLocated=false
mState=INACTIVE mLightState=IDLE
mInactiveTimeout=+30m0s0ms
mNextAlarmTime=+22m36s283ms
mNextIdleDelay=+10m0s0ms (flex=+2m0s0ms)
mNextLightAlarmTime=-23s699ms
mCurLightIdleBudget=+1m0s0ms
Конечно же, призовыми жемчужинами здесь являются mScreenOn
и mScreenLocked
, которые являются булевыми значениями и делают именно то, к чему вы их направили.
Вы можете использовать awk, чтобы выдать желаемый ответ. Вот быстрый и грязный awk-скрипт, который я только что состряпал:
adb shell dumpsys power | awk -F"[ =]" '/mWakefulness=/ { mw=$NF; }
/mHoldingWakeLockSuspendBlocker=/ {mh=$NF;}
END {
print mw
print mh
}'
ответил в Есть ли способ проверить, заблокирован ли экран устройства Android через adb? - Stack Overflow и скопировать сюда:
XiaoMi 9
10
mDreamingLockscreen
adb shell dumpsys window | grep mDreamingLockscreen
mShowingDream=false mDreamingLockscreen=true mDreamingSleepToken=null
-> Экран заблокирован
ON
илиOFF
mShowingDream=false mDreamingLockscreen=false mDreamingSleepToken=null
-> Экран разблокированnfc
(если на андроиде есть модуль NFC)adb shell dumpsys nfc | grep 'mScreenState='
mScreenState=OFF_LOCKED
-> Экран выключен и заблокированmScreenState=ON_LOCKED
-> Экран включен и заблокированmScreenState=ON_UNLOCKED
-> Экран включен и разблокирован
ледвиндер96
два