有没有办法通过 adb 检查 Android 设备屏幕是否被锁定?
Is there a way to check if Android device screen is locked via adb?
我知道 PowerManager and/or KeyguardManager 可以帮助我检查设备屏幕是否 locked/unlocked。有没有办法通过 adb 检查这个?
此命令将输出与设备电源相关的所有信息:
adb shell dumpsys power
您可以将其通过管道传递给 grep 以获取 mHoldingWakeLockSuspendBlocker
和 mHoldingDisplaySuspendBlocker
的值:
adb shell dumpsys power | grep 'mHolding'
如果两者都为假,则显示关闭。
如果 mHoldingWakeLockSuspendBlocker
为假,并且 mHoldingDisplaySuspendBlocker
为真,则显示已打开,但已锁定。
如果两者都为真,则显示打开。
如果它是 root phone,您可以检查 settings.db.
中与 lock 相关的一些字段
settings.db 位于 /data/data/com.android.providers.settings/databases
因为 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
Bryan 的解决方案不适用于我的设备(Samsung Galaxy S3 运行ning 版本 4.4.2)。
对于我的 KitKat GS3:
- 我可以通过检查
mScreenOn=true
可靠地判断屏幕是否打开(无论屏幕锁定状态如何)。
- 我可以通过检查
mUserActivityTimeoutOverrideFromWindowManager=-1
可靠地判断屏幕是否已解锁(无论屏幕打开还是关闭都有效)。
如果这对您不起作用,我建议您尝试以下方法:
- 锁定 phone 并关闭屏幕然后 运行:
adb shell dumpsys power > dumpsys.power.screen_off.locked.txt
- 唤醒 phone 并保持锁定然后 运行:
adb shell dumpsys power > dumpsys.power.screen_on.locked.txt
- 保持phone清醒并解锁屏幕然后运行:
adb shell dumpsys power > dumpsys.power.screen_on.unlocked.txt
- 关闭屏幕,但不要锁定 运行:
adb shell dumpsys power > dumpsys.power.screen_off.unlocked.txt
- 然后使用文本比较工具(如 winmerge)查找
.txt
个文件之间的差异。
这仅在设备具有 NFC 时有效:
# returns one of: mScreenState=OFF|ON_LOCKED|ON_UNLOCKED
adb shell dumpsys nfc | grep 'mScreenState='
OFF - 屏幕关闭
ON_LOCKED - 屏幕显示锁屏
ON_UNLOCKED - 设备已解锁
我正在使用的一个 adb 命令是:
adb shell dumpsys window
这returns几个有用的系统变量如mAwake
、mShowingLockscreen
、mScreenOnEarly
、mScreenOnFully
.
为了找出哪个对应于 locked/unlocked 屏幕,我使用了 adb shell dumpsys window > <textFileNameOfYourChoice>
tl;博士
我发现持久的组合是:
设备已锁定且屏幕已关闭:
mAwake=false
和 mShowingLockscreen=true
设备已锁定且屏幕已打开:
mAwake=true
和 mShowingLockscreen=true
设备已解锁且屏幕已打开:
mAwake=true
和 mShowingLockscreen=false
附上 phone 和 运行 此代码。
按下电源按钮,查看发生的变化。
解锁 phone 并查看发生的变化。
实验。玩得开心。
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)
例如,这些是您锁定 phone 并且屏幕黑屏后发生的变化:
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
此处总结其他(@Vouskopes
等)答案:
- 我的Phone:
XiaoMi 9
- Android:
10
使用 adb 检查屏幕锁定状态
方法一:(通用)使用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
-> 屏幕打开并解锁
尝试adb shell dumpsys window | grep mCurrentFocus | grep StatusBar
;
由于此CMD执行的所有解锁状态(包括错误的PIN)return 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;
我知道 PowerManager and/or KeyguardManager 可以帮助我检查设备屏幕是否 locked/unlocked。有没有办法通过 adb 检查这个?
此命令将输出与设备电源相关的所有信息:
adb shell dumpsys power
您可以将其通过管道传递给 grep 以获取 mHoldingWakeLockSuspendBlocker
和 mHoldingDisplaySuspendBlocker
的值:
adb shell dumpsys power | grep 'mHolding'
如果两者都为假,则显示关闭。
如果 mHoldingWakeLockSuspendBlocker
为假,并且 mHoldingDisplaySuspendBlocker
为真,则显示已打开,但已锁定。
如果两者都为真,则显示打开。
如果它是 root phone,您可以检查 settings.db.
中与 lock 相关的一些字段settings.db 位于 /data/data/com.android.providers.settings/databases
因为 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
Bryan 的解决方案不适用于我的设备(Samsung Galaxy S3 运行ning 版本 4.4.2)。
对于我的 KitKat GS3:
- 我可以通过检查
mScreenOn=true
可靠地判断屏幕是否打开(无论屏幕锁定状态如何)。 - 我可以通过检查
mUserActivityTimeoutOverrideFromWindowManager=-1
可靠地判断屏幕是否已解锁(无论屏幕打开还是关闭都有效)。
如果这对您不起作用,我建议您尝试以下方法:
- 锁定 phone 并关闭屏幕然后 运行:
adb shell dumpsys power > dumpsys.power.screen_off.locked.txt
- 唤醒 phone 并保持锁定然后 运行:
adb shell dumpsys power > dumpsys.power.screen_on.locked.txt
- 保持phone清醒并解锁屏幕然后运行:
adb shell dumpsys power > dumpsys.power.screen_on.unlocked.txt
- 关闭屏幕,但不要锁定 运行:
adb shell dumpsys power > dumpsys.power.screen_off.unlocked.txt
- 然后使用文本比较工具(如 winmerge)查找
.txt
个文件之间的差异。
这仅在设备具有 NFC 时有效:
# returns one of: mScreenState=OFF|ON_LOCKED|ON_UNLOCKED
adb shell dumpsys nfc | grep 'mScreenState='
OFF - 屏幕关闭
ON_LOCKED - 屏幕显示锁屏
ON_UNLOCKED - 设备已解锁
我正在使用的一个 adb 命令是:
adb shell dumpsys window
这returns几个有用的系统变量如mAwake
、mShowingLockscreen
、mScreenOnEarly
、mScreenOnFully
.
为了找出哪个对应于 locked/unlocked 屏幕,我使用了 adb shell dumpsys window > <textFileNameOfYourChoice>
tl;博士
我发现持久的组合是:
设备已锁定且屏幕已关闭:
mAwake=false
和 mShowingLockscreen=true
设备已锁定且屏幕已打开:
mAwake=true
和 mShowingLockscreen=true
设备已解锁且屏幕已打开:
mAwake=true
和 mShowingLockscreen=false
附上 phone 和 运行 此代码。
按下电源按钮,查看发生的变化。
解锁 phone 并查看发生的变化。
实验。玩得开心。
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)
例如,这些是您锁定 phone 并且屏幕黑屏后发生的变化:
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
此处总结其他(@Vouskopes
等)答案:
- 我的Phone:
XiaoMi 9
- Android:
10
- Android:
使用 adb 检查屏幕锁定状态
方法一:(通用)使用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
-> 屏幕打开并解锁
尝试adb shell dumpsys window | grep mCurrentFocus | grep StatusBar
;
由于此CMD执行的所有解锁状态(包括错误的PIN)return 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;