Команды Adb для получения состояния экрана и заблокированного состояния

Фон:

Я использую автоматические тесты на многих различных вариантах устройств ( планшеты и смартфоны Samsung, такие как Galaxy A5, S8, S7 и т. д. ), где устройства имеют разные версии Android ( 6.0, 6.0.1, 7.0 и 7.1.1 ) - все в разных сочетаниях.

Некоторые из моих тестов требуют блокировки экрана (его выключения), а затем его включения и ввода PIN-кода. Мне не удалось найти (универсальную) команду adb для получения состояния телефонов. В идеале я хотел бы, чтобы одна команда сообщала мне, в каком из следующих состояний находится телефон:

  1. Экран выключен (предполагается, что он также заблокирован)
  2. Экран включен, заблокирован
  3. Экран включен, разблокирован

Мое лучшее решение на данный момент - использовать следующие 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='

Поскольку время является проблемой, предлагаемое решение (лучший ответ в ссылке) также неприемлемо.

Ответы (4)

Я фанат 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

используйте adb для проверки состояния заблокированного экрана

метод 1: (универсальное) использованиеmDreamingLockscreen

  • Команда:adb shell dumpsys window | grep mDreamingLockscreen
  • Выход:
    • mShowingDream=false mDreamingLockscreen=true mDreamingSleepToken=null-> Экран заблокирован
      • независимо от того, экран ONилиOFF
    • mShowingDream=false mDreamingLockscreen=false mDreamingSleepToken=null-> Экран разблокирован

способ 2: использовать nfc(если на андроиде есть модуль NFC)

  • Команда:adb shell dumpsys nfc | grep 'mScreenState='
  • Выход:
    • mScreenState=OFF_LOCKED-> Экран выключен и заблокирован
    • mScreenState=ON_LOCKED-> Экран включен и заблокирован
    • mScreenState=ON_UNLOCKED-> Экран включен и разблокирован
Я бы сказал, что имеет значение, включен ли экран или нет. Если экран выключен, то мне сначала нужно включить его, прежде чем я смогу ввести пин-код (путем имитации нажатия/пролистывания меню), а затем ввести пин-код. Как мне ввести пин-код, если экран выключен?
Не совсем, только универсальный, если они реализуют блокировку Daydream… Samsung, например, нет.