Comando(s) Adb para obtener el estado de la pantalla y el estado bloqueado

Fondo:

Estoy usando pruebas automatizadas en muchas variantes diferentes de dispositivos ( tabletas Samsung y teléfonos inteligentes como Galaxy A5, S8, S7, etc. ) donde los dispositivos tienen diferentes versiones de Android ( 6.0, 6.0.1, 7.0 y 7.1.1 ) - todo en combinaciones variadas.

Algunas de mis pruebas requieren bloquear la pantalla (apagarla) y luego encenderla e ingresar el PIN. No he podido encontrar un comando adb (universal) para obtener el estado de los teléfonos. Idealmente, me gustaría que un comando me dijera en cuál de los siguientes estados se encuentra el teléfono:

  1. Pantalla apagada (se supone que también está bloqueada)
  2. Pantalla encendida, bloqueada
  3. Pantalla encendida, desbloqueada

Mi mejor solución hasta ahora es usar los siguientes 2 comandos (terminal bash):

#1:
adb shell dumpsys display | grep "mScreenState"

#2:
adb shell service call trust 7

El comando #1 me dice si la pantalla está encendida, apagada o "dormida".

El comando #2 me dice si el teléfono está bloqueado o desbloqueado.

Preguntas:

¿Hay un solo comando adb que pueda darme la información que necesito? ¿Este comando es compatible con las versiones de Android mencionadas anteriormente?

En la versión 6.* de Android, el comando #2 siempre indica que el teléfono está bloqueado. ¿Cuál es la alternativa "Android 6.* compatible" del comando #2? ----> ¡ Por pura casualidad, descubrí que "service call trust 6 " funciona como se esperaba en los dispositivos Android 6 .!*

Nota:

El recurso que encontré que más se parece a mi problema es la siguiente pregunta/respuesta de SO . Sin embargo, no todos los dispositivos tienen/utilizan NFC, por lo que el siguiente comando (aunque compatible con la mayoría de los dispositivos/versiones) no es aceptable en mis pruebas:

adb shell dumpsys nfc | grep 'mScreenState='

Dado que el tiempo es un problema, la solución propuesta (la mejor respuesta en el enlace) tampoco es aceptable.

Respuestas (4)

Soy un fanático de Windows, por lo que la solución contiene finden lugar de usar grep, simplemente reemplace find con grep.

adb shell dumpsys power | find "mWakefulness="
adb shell dumpsys power | find "mHoldingWakeLockSuspendBlocker=" 

Pantalla APAGADA y bloqueada = mWakefulness= Dormido & mHoldingWakeLockSuspendBlocker= false

Pantalla ENCENDIDA y bloqueada = mWakefulness= Awake & mHoldingWakeLockSuspendBlocker= false

Pantalla ENCENDIDA y desbloqueada = mWakefulness = Despierto & mHoldingWakeLockSuspendBlocker = verdadero

PD: Lo he probado en Android 7.0 , no sé si funcionará con otras versiones.

Como me encontré con esto recientemente y dado que el uso de la pantalla de bloqueo de Daydream no es un requisito en Android, aquí hay algunas variables más nuevas que (probablemente) son universales.

Deberían estar disponibles a partir de Android M (6.0 / API 23) ya que vienen con el modo Doze; Los he confirmado con Android 10 en un Samsung Galaxy Tab S4 y Android 12 en un 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

Por supuesto, las joyas premiadas aquí son mScreenOny mScreenLocked, que son valores booleanos que hacen exactamente lo que buscaste.

Podrías usar awk para escupir la respuesta que quieres. Aquí hay un script awk rápido y sucio que preparé hace un momento:

adb shell dumpsys power | awk -F"[ =]" '/mWakefulness=/ { mw=$NF; }
/mHoldingWakeLockSuspendBlocker=/ {mh=$NF;}
END {
  print mw
  print mh
}'

ha respondido en ¿Hay alguna manera de verificar si la pantalla del dispositivo Android está bloqueada a través de adb? - Stack Overflow y copia aquí:

  • Mi teléfono:XiaoMi 9
    • Androide:10

use adb para verificar el estado de la pantalla bloqueada

método 1: uso (universal)mDreamingLockscreen

  • Dominio:adb shell dumpsys window | grep mDreamingLockscreen
  • Producción:
    • mShowingDream=false mDreamingLockscreen=true mDreamingSleepToken=null-> Pantalla bloqueada
      • no importa la pantalla es ONoOFF
    • mShowingDream=false mDreamingLockscreen=false mDreamingSleepToken=null-> Pantalla desbloqueada

método 2: usar nfc(si Android tiene un módulo NFC)

  • Dominio:adb shell dumpsys nfc | grep 'mScreenState='
  • Producción:
    • mScreenState=OFF_LOCKED-> Pantalla APAGADA y bloqueada
    • mScreenState=ON_LOCKED-> Pantalla encendida y bloqueada
    • mScreenState=ON_UNLOCKED-> Pantalla ENCENDIDA y desbloqueada
Yo diría que sí importa si la pantalla está encendida o apagada. Si la pantalla está apagada, primero tendría que encenderla antes de poder ingresar el PIN (simulando presionar/deslizar el menú) y luego ingresar el PIN. ¿Cómo ingresaría el PIN si la pantalla está apagada?
No del todo, solo universal si están implementando el bloqueo Daydream... Samsung, por ejemplo, no lo está.