【问题标题】:Is there a way to check if Android device screen is locked via adb?有没有办法通过 adb 检查 Android 设备屏幕是否被锁定?
【发布时间】:2021-04-13 21:40:06
【问题描述】:

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

【问题讨论】:

    标签: android adb


    【解决方案1】:

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

    adb shell dumpsys power
    

    您可以将其通过管道传递给 grep 以获取 mHoldingWakeLockSuspendBlockermHoldingDisplaySuspendBlocker 的值:

    adb shell dumpsys power | grep 'mHolding'
    

    如果两者都为假,则显示关闭。

    如果mHoldingWakeLockSuspendBlocker 为假,mHoldingDisplaySuspendBlocker 为真,则显示开启,但已锁定。

    如果两者都为真,则显示开启。

    【讨论】:

    • 我看到 mHoldingWakeLockSuspendBlocker 在设备解锁后的几秒钟内来回更改值,但即使显示器保持解锁状态,它也会稳定为 WakeLock=false 和 Display=true。
    • 检查 mHoldingDisplaySuspendBlocker 不可靠,例如如果你在按下电源按钮关闭显示器后立即运行它,这仍然会返回 true,存在一些时间问题。
    • 请注意,即使这是一个公认的答案,上述方法也不能可靠地工作 - 正如其他 cmets 所指出的那样。当屏幕锁定时,这两个值都会为假,但是当显示打开时,没有关系。
    • 如果我想对多个设备中的一个设备使用第二个命令,在 bash 终端中可以,我只需编写 'adb -s $dev_number shell'...
    【解决方案2】:

    由于 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/…
    • 确实不清楚。谁做了什么?我只是看到屏幕打开我得到: Result: Parcel(00000000 00000001 '........') 屏幕关闭我得到 Result: Parcel(00000000 00000000 '........') .这与 service call power 12. 那是我应该使用的?
    • 哇,这是一个很棒的发现!被选为最佳答案的答案是不稳定的,有时在屏幕仍处于解锁状态时对两个变量都返回 true,而这是一个真正的测试!非常感谢!
    • 它真的很难看,但唯一对我有用的东西。 service call power 12 也适用于 Android 9/Pie。但是价值观是相反的! screen_is_locked = "00000000 00000000" 和 screen_is_unlocked = "00000000 00000001"
    【解决方案3】:

    这仅在设备具有 NFC 时有效:

    # returns one of: mScreenState=OFF|ON_LOCKED|ON_UNLOCKED
    adb shell dumpsys nfc | grep 'mScreenState='
    

    关闭 - 屏幕关闭

    ON_LOCKED - 屏幕显示锁定屏幕

    ON_UNLOCKED - 设备已解锁

    【讨论】:

    • 你相信吗,甚至还有OFF_UNLOCKED。在三星 S10 上看到。
    【解决方案4】:

    在这里总结其他(@Vouskopes 等)的答案:

    • 我的手机:XiaoMi 9
      • 安卓:10

    使用adb查看锁屏状态

    方法一:(通用)使用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 -> 屏幕开启并解锁

    【讨论】:

      【解决方案5】:

      Bryan 的解决方案不适用于我的设备(运行版本 4.4.2 的三星 Galaxy S3)。

      对于我的 KitKat GS3:

      • 我可以通过检查mScreenOn=true 可靠地判断屏幕是否打开(无论屏幕锁定状态如何都有效)。
      • 我可以通过检查 mUserActivityTimeoutOverrideFromWindowManager=-1 可靠地判断屏幕是否已解锁(无论屏幕打开还是关闭都有效)。

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

      1. 锁定手机并关闭屏幕然后运行:

      adb shell dumpsys power > dumpsys.power.screen_off.locked.txt

      1. 唤醒手机并保持锁定然后运行:

      adb shell dumpsys power > dumpsys.power.screen_on.locked.txt

      1. 保持手机唤醒并解锁屏幕然后运行:

      adb shell dumpsys power > dumpsys.power.screen_on.unlocked.txt

      1. 关闭屏幕,但不要锁定然后运行:

      adb shell dumpsys power > dumpsys.power.screen_off.unlocked.txt

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

      【讨论】:

        【解决方案6】:

        我正在使用的一个 adb 命令是:

        adb shell dumpsys window

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

        为了确定哪个对应于锁定/解锁屏幕,我使用了adb shell dumpsys window > <textFileNameOfYourChoice>

        tl;博士

        我发现持久的组合是:

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

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

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

        【讨论】:

          【解决方案7】:

          连接手机并运行此代码。

          按下电源按钮,看看发生的变化。

          解锁手机并查看发生的变化。

          实验。玩得开心。

          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】:

            如果是 root 手机,您可以检查 settings.db 中与 lock 相关的一些字段。

            settings.db 位于/data/data/com.android.providers.settings/databases

            【讨论】:

            • 我正在寻找适用于有根设备和无根设备的东西。不过谢谢!
            【解决方案9】:

            试试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;

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-12-23
              • 2020-11-05
              • 2012-07-15
              • 1970-01-01
              • 1970-01-01
              • 2010-11-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多