有没有办法检查Android设备屏幕是否通过adb锁定?

时间:2016-02-08 17:36:07

标签: android adb

我知道PowerManager和/或KeyguardManager可以帮助我检查设备屏幕是否被锁定/解锁。有没有办法通过adb检查这个?

9 个答案:

答案 0 :(得分:6)

此命令将输出与设备电源相关的所有内容:

adb shell dumpsys power

您可以将其传输到grep以获取mHoldingWakeLockSuspendBlockermHoldingDisplaySuspendBlocker的值:

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,都可以正常工作)。

如果这对您不起作用,我建议您尝试以下方法:

  1. 锁定手机&关闭屏幕然后运行:
  2. adb shell dumpsys power > dumpsys.power.screen_off.locked.txt

    1. 唤醒电话&保持锁定然后运行:
    2. adb shell dumpsys power > dumpsys.power.screen_on.locked.txt

      1. 保持手机清醒并解锁屏幕,然后运行:
      2. adb shell dumpsys power > dumpsys.power.screen_on.unlocked.txt

        1. 关闭屏幕,但不要将其锁定,然后运行:
        2. adb shell dumpsys power > dumpsys.power.screen_off.unlocked.txt

          1. 然后使用文本差异工具(如winmerge)查找.txt文件之间的差异。

答案 4 :(得分:1)

我使用的一个adb命令是:

adb shell dumpsys window

这会返回一些有用的系统变量,例如mAwakemShowingLockscreenmScreenOnEarlymScreenOnFully

为了找出与锁定/解锁屏幕相对应的内容,我使用了adb shell dumpsys window > <textFileNameOfYourChoice>

TL;博士

我发现持久的组合是:

设备已锁定且屏幕已关闭: mAwake=falsemShowingLockscreen=true

设备已锁定且屏幕已开启: mAwake=truemShowingLockscreen=true

设备已解锁且屏幕已开启: mAwake=truemShowingLockscreen=false

答案 5 :(得分:1)

在这里回答其他(@Vouskopes等)

  • 我的电话:XiaoMi 9
    • Android:10

使用adb检查屏幕锁定状态

方法1 :(通用)使用mDreamingLockscreen

  • 命令:adb shell dumpsys window | grep mDreamingLockscreen
  • 输出:
    • mShowingDream=false mDreamingLockscreen=true mDreamingSleepToken=null->屏幕已锁定
      • 无论屏幕是ON还是OFF
    • mShowingDream=false mDreamingLockscreen=false mDreamingSleepToken=null-> Scrren 已解锁

方法2:使用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;