我知道PowerManager和/或KeyguardManager可以帮助我检查设备屏幕是否被锁定/解锁。有没有办法通过adb检查这个?
答案 0 :(得分:6)
此命令将输出与设备电源相关的所有内容:
adb shell dumpsys power
您可以将其传输到grep以获取mHoldingWakeLockSuspendBlocker
和mHoldingDisplaySuspendBlocker
的值:
adb shell dumpsys power | grep 'mHolding'
如果两者都为假,则显示屏关闭。
如果mHoldingWakeLockSuspendBlocker
为false,且mHoldingDisplaySuspendBlocker
为真,则显示屏已开启,但已锁定。
如果两者都为真,则显示屏开启。
答案 1 :(得分:5)
由于Lollipop PowerManager.isInteractive()
和TrustManager.isDeviceLocked()
是检查设备屏幕是否已开启和解锁的正确方法。
他们相应的service call
命令将是:
adb shell service call power 12
和
adb shell service call trust 7
这就是如何从Python代码中检查它,而无需为您的设备找到Android版本特定的服务调用代码 - https://gist.github.com/ktnr74/60ac7bcc2cd17b43f2cb
答案 2 :(得分:5)
仅当设备具有NFC时才有效:
# returns one of: mScreenState=OFF|ON_LOCKED|ON_UNLOCKED
adb shell dumpsys nfc | grep 'mScreenState='
关闭 - 屏幕关闭
ON_LOCKED - 屏幕显示锁定屏幕
ON_UNLOCKED - 设备已解锁
答案 3 :(得分:1)
Bryan的解决方案不适用于我的设备(三星Galaxy S3运行版本4.4.2)。
对于我的KitKat GS3:
mScreenOn=true
来确定屏幕是否打开(无论屏幕锁定状态如何都可以正常工作)。mUserActivityTimeoutOverrideFromWindowManager=-1
来确定屏幕是否已解锁(无论屏幕是ON还是OFF,都可以正常工作)。如果这对您不起作用,我建议您尝试以下方法:
adb shell dumpsys power > dumpsys.power.screen_off.locked.txt
adb shell dumpsys power > dumpsys.power.screen_on.locked.txt
adb shell dumpsys power > dumpsys.power.screen_on.unlocked.txt
adb shell dumpsys power > dumpsys.power.screen_off.unlocked.txt
.txt
文件之间的差异。答案 4 :(得分:1)
我使用的一个adb命令是:
adb shell dumpsys window
这会返回一些有用的系统变量,例如mAwake
,mShowingLockscreen
,mScreenOnEarly
,mScreenOnFully
。
为了找出与锁定/解锁屏幕相对应的内容,我使用了adb shell dumpsys window > <textFileNameOfYourChoice>
TL;博士
我发现持久的组合是:
设备已锁定且屏幕已关闭:
mAwake=false
和mShowingLockscreen=true
设备已锁定且屏幕已开启:
mAwake=true
和mShowingLockscreen=true
设备已解锁且屏幕已开启:
mAwake=true
和mShowingLockscreen=false
答案 5 :(得分:1)
在这里回答其他(@Vouskopes
等)
XiaoMi 9
10
mDreamingLockscreen
adb shell dumpsys window | grep mDreamingLockscreen
mShowingDream=false mDreamingLockscreen=true mDreamingSleepToken=null
->屏幕已锁定
ON
还是OFF
mShowingDream=false mDreamingLockscreen=false mDreamingSleepToken=null
-> Scrren 已解锁 nfc
(如果android有NFC模块)adb shell dumpsys nfc | grep 'mScreenState='
mScreenState=OFF_LOCKED
->屏幕关闭并锁定mScreenState=ON_LOCKED
->屏幕打开并锁定mScreenState=ON_UNLOCKED
->屏幕打开并解锁答案 6 :(得分:0)
如果是root手机,您可以在settings.db中查看与 lock 相关的一些字段。
settings.db位于/data/data/com.android.providers.settings/databases
答案 7 :(得分:0)
连接手机并运行此代码。
按下电源按钮,查看发生的更改。
解锁手机并查看发生的更改。
实验。玩得开心。
import re
import subprocess
import time
states = {
'no_cached_wake_locks': '',
'mDirty': '',
'mWakefulness': '',
'mWakefulnessChanging': '',
'mIsPowered': '',
'mPlugType': '',
'mBatteryLevel': '',
'mBatteryLevelCriticalLow': '',
'mLastBatteryLevelCriticalLowTime': '',
'mBatteryLevelWhenDreamStarted': '',
'mDockState': '',
'mStayOn': '',
'mProximityPositive': '',
'mBootCompleted': '',
'mSystemReady': '',
'mHalAutoSuspendModeEnabled': '',
'mHalInteractiveModeEnabled': '',
'mWakeLockSummary': '',
'mUserActivitySummary': '',
'mRequestWaitForNegativeProximity': '',
'mSandmanScheduled': '',
'mSandmanSummoned': '',
'mLowPowerModeEnabled': '',
'mBatteryLevelLow': '',
'mLightDeviceIdleMode': '',
'mDeviceIdleMode': '',
'mScreenBrightnessBoostInProgress': '',
'mDisplayReady': '',
'mHoldingWakeLockSuspendBlocker': '',
'mHoldingDisplaySuspendBlocker': '',
}
def checkit():
cmd = ['adb', 'shell', 'dumpsys', 'power']
proc = subprocess.Popen(cmd,
bufsize=0,
universal_newlines=True,
stdin=None,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
changes = 0
for line2 in proc.stdout.readlines():
line = line2.strip()
for state, value in states.items():
m = re.search(r'{}=(.*)'.format(state), line)
if m:
if value != m.group(1):
changes += 1
print("changed: state={} old={} new={}".format(state, value, m.group(1)))
states[state] = m.group(1)
if changes > 0:
print("---- {} changes".format(changes))
while True:
checkit()
time.sleep(0.5)
例如,这些是在您锁定手机并且屏幕呈黑色后发生的更改:
changed: state=mWakefulness old=Awake new=Asleep
changed: state=mHalAutoSuspendModeEnabled old=false new=true
changed: state=mHalInteractiveModeEnabled old=true new=false
changed: state=mUserActivitySummary old=0x4 new=0x0
changed: state=mHoldingDisplaySuspendBlocker old=true new=false
---- 5 changes
changed: state=mWakeLockSummary old=0x1 new=0x0
changed: state=mHoldingWakeLockSuspendBlocker old=true new=false
---- 2 changes
changed: state=mWakeLockSummary old=0x0 new=0x1
changed: state=mHoldingWakeLockSuspendBlocker old=false new=true
---- 2 changes
changed: state=mWakeLockSummary old=0x1 new=0x0
changed: state=mHoldingWakeLockSuspendBlocker old=true new=false
---- 2 changes
答案 8 :(得分:0)
试试adb shell dumpsys window | grep mCurrentFocus | grep StatusBar
;
由于此 CMD 执行的所有解锁状态(包括错误的 PIN)返回 mCurrentFocus=Window{343b978 u0 StatusBar}
例如:
#!/bin/bash
if adb shell dumpsys window | grep mCurrentFocus | grep -q StatusBar; then
echo 'phone is locked';
exit 0;
fi
echo 'phone is unlocked'
Android 10;