Adb-Befehl(e) zum Abrufen des Bildschirmstatus und des Sperrstatus

Hintergrund:

Ich verwende automatisierte Tests auf vielen verschiedenen Varianten von Geräten ( Samsung Tablets und Smartphones wie Galaxy A5, S8, S7 usw. ), wobei die Geräte unterschiedliche Versionen von Android haben ( 6.0, 6.0.1, 7.0 und 7.1.1 ) - alle in unterschiedlichen Kombinationen.

Einige meiner Tests erfordern das Sperren des Bildschirms (Ausschalten) und dann das Einschalten und die PIN-Eingabe. Ich konnte keinen (universellen) adb-Befehl finden, um den Status des Telefons abzurufen. Idealerweise möchte ich, dass mir ein Befehl mitteilt, in welchem ​​der folgenden Zustände sich das Telefon befindet:

  1. Bildschirm ausgeschaltet (angenommen auch gesperrt)
  2. Bildschirm eingeschaltet, gesperrt
  3. Bildschirm eingeschaltet, entsperrt

Meine bisher beste Lösung ist die Verwendung der folgenden 2 (Bash-Terminal) Befehle:

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

#2:
adb shell service call trust 7

Befehl Nr. 1 sagt mir, ob der Bildschirm an, aus oder "gedöst" ist.

Befehl Nr. 2 sagt mir, ob das Telefon gesperrt oder entsperrt ist.

Fragen:

Gibt es einen einzelnen adb-Befehl, der mir die Informationen geben kann, die ich brauche? Ist dieser Befehl mit den oben aufgeführten Android-Versionen kompatibel?

Auf Android-Version 6.* zeigt Befehl #2 immer an, dass das Telefon gesperrt ist. Was ist die „Android 6.*-kompatible“ Alternative zu Befehl Nr. 2? ----> Rein zufällig fand ich heraus, dass "service call trust 6 " auf Android 6.- Geräten wie erwartet funktioniert!*

Notiz:

Die Ressource, die ich gefunden habe und die meinem Problem am ähnlichsten ist, ist die folgende SO-Frage/Antwort . Allerdings haben/verwenden nicht alle Geräte NFC, sodass der folgende Befehl (obwohl er mit den meisten Geräten/Versionen kompatibel ist) in meinen Tests nicht akzeptabel ist:

adb shell dumpsys nfc | grep 'mScreenState='

Da das Timing ein Problem darstellt, ist die vorgeschlagene Lösung (beste Antwort im Link) ebenfalls nicht akzeptabel.

Antworten (4)

Ich bin ein Windows-Fanboy, daher enthält die Lösung findanstelle von grep, ersetzen Sie einfach find durch grep.

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

Bildschirm AUS und gesperrt = mWakefulness= Schlafend & mHoldingWakeLockSuspendBlocker= false

Bildschirm EIN und gesperrt = mWakefulness= Awake & mHoldingWakeLockSuspendBlocker= false

Bildschirm EIN und entsperrt = mWakefulness= Awake & mHoldingWakeLockSuspendBlocker= true

PS: Ich habe es auf Android 7.0 getestet , weiß nicht, ob es mit anderen Versionen funktioniert.

Da ich kürzlich darauf gestoßen bin und die Verwendung des Daydream-Sperrbildschirms auf Android nicht erforderlich ist, sind hier einige neuere Variablen, die (wahrscheinlich) universell sind.

Sie sollten ab Android M (6.0 / API 23) verfügbar sein , da sie mit dem Doze-Modus ausgestattet sind. Ich habe sie mit Android 10 auf einem Samsung Galaxy Tab S4 und Android 12 auf einem Pixel 4 XL bestätigt .

$ 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

Natürlich sind die Preisjuwelen hier mScreenOnund mScreenLocked, die boolesche Werte sind, die genau das tun, was Sie ihnen gegeben haben.

Sie könnten awk verwenden, um die gewünschte Antwort auszuspucken. Hier ist ein schnelles und schmutziges awk-Skript, das ich gerade entwickelt habe:

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

hat in Gibt es eine Möglichkeit zu überprüfen, ob der Bildschirm des Android-Geräts über adb gesperrt ist? - Stapelüberlauf und hierher kopieren:

  • Mein Telefon:XiaoMi 9
    • Android:10

Verwenden Sie adb, um den Status der Bildschirmsperre zu überprüfen

Methode 1: (universeller) EinsatzmDreamingLockscreen

  • Befehl:adb shell dumpsys window | grep mDreamingLockscreen
  • Ausgang:
    • mShowingDream=false mDreamingLockscreen=true mDreamingSleepToken=null-> Bildschirm gesperrt
      • egal Screen ist ONoderOFF
    • mShowingDream=false mDreamingLockscreen=false mDreamingSleepToken=null-> Bildschirm entsperrt

Methode 2: verwenden nfc(wenn Android NFC-Modul hat)

  • Befehl:adb shell dumpsys nfc | grep 'mScreenState='
  • Ausgang:
    • mScreenState=OFF_LOCKED-> Bildschirm AUS und gesperrt
    • mScreenState=ON_LOCKED-> Bildschirm EIN und gesperrt
    • mScreenState=ON_UNLOCKED-> Bildschirm EIN und entsperrt
Ich würde sagen, dass es egal ist, ob der Bildschirm an oder aus ist. Wenn der Bildschirm ausgeschaltet ist, muss ich ihn zuerst einschalten, bevor ich die PIN eingeben kann (durch Simulieren des Drückens/Wischens des Menüs) und dann die PIN eingeben. Wie würde ich die PIN eingeben, wenn der Bildschirm ausgeschaltet ist?
Nicht ganz, nur universell, wenn sie die Daydream-Sperre implementieren … Samsung zum Beispiel ist es nicht.