【发布时间】:2021-04-13 21:40:06
【问题描述】:
我知道 PowerManager 和/或 KeyguardManager 可以帮助我检查设备屏幕是否被锁定/解锁。有没有办法通过 adb 来检查?
【问题讨论】:
我知道 PowerManager 和/或 KeyguardManager 可以帮助我检查设备屏幕是否被锁定/解锁。有没有办法通过 adb 来检查?
【问题讨论】:
此命令将输出与设备电源相关的所有内容:
adb shell dumpsys power
您可以将其通过管道传递给 grep 以获取 mHoldingWakeLockSuspendBlocker 和 mHoldingDisplaySuspendBlocker 的值:
adb shell dumpsys power | grep 'mHolding'
如果两者都为假,则显示关闭。
如果mHoldingWakeLockSuspendBlocker 为假,mHoldingDisplaySuspendBlocker 为真,则显示开启,但已锁定。
如果两者都为真,则显示开启。
【讨论】:
由于 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
【讨论】:
service call 输出时需要帮助 - 只需提出一个新的单独问题。另请阅读ktnr74.blogspot.com/2014/09/…
这仅在设备具有 NFC 时有效:
# returns one of: mScreenState=OFF|ON_LOCKED|ON_UNLOCKED
adb shell dumpsys nfc | grep 'mScreenState='
关闭 - 屏幕关闭
ON_LOCKED - 屏幕显示锁定屏幕
ON_UNLOCKED - 设备已解锁
【讨论】:
OFF_UNLOCKED。在三星 S10 上看到。
在这里总结其他(@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 -> 屏幕开启并解锁【讨论】:
Bryan 的解决方案不适用于我的设备(运行版本 4.4.2 的三星 Galaxy S3)。
对于我的 KitKat GS3:
mScreenOn=true 可靠地判断屏幕是否打开(无论屏幕锁定状态如何都有效)。mUserActivityTimeoutOverrideFromWindowManager=-1 可靠地判断屏幕是否已解锁(无论屏幕打开还是关闭都有效)。如果这对您不起作用,我建议您尝试以下方法:
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 文件之间的差异。【讨论】:
我正在使用的一个 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
【讨论】:
连接手机并运行此代码。
按下电源按钮,看看发生的变化。
解锁手机并查看发生的变化。
实验。玩得开心。
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
【讨论】:
如果是 root 手机,您可以检查 settings.db 中与 lock 相关的一些字段。
settings.db 位于/data/data/com.android.providers.settings/databases
【讨论】:
试试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;
【讨论】: