53

有没有办法通过 ADB 锁定 Android 屏幕?

我找到了将显示锁定在 apk 中的方法,但我想通过 ADB 从 PC 锁定屏幕,以模拟显示超时,而无需等待超时。

是否有可能做到这一点?

谢谢,黛安

4

8 回答 8

78

太棒了,我刚刚发现KEYCODE_POWER是26。

所以它通过发送来工作:

adb shell input keyevent 26

如果屏幕解锁,它会锁定屏幕。如果屏幕已经锁定,它会唤醒设备。

我的猜测是,确保屏幕被锁定(关闭)的唯一方法是解锁(我们使用 keyevent 82(菜单),然后使用电源按钮 keyevent 锁定它。有人知道这是否属实吗?

于 2012-12-12T23:44:14.860 回答
17

Michael R. Hines 给出了可以说是最简单的解决方案。但是,以下行在更高版本的 Android 中没有用。

adb shell input keyevent 82 # unlock

我已经使用我想要唤醒的单个设备(平板电脑)的坐标更新了 shell 脚本。我的平板电脑不支持锁屏事件的方向更改,因此这些值始终有效,因为锁屏始终处于横向状态。如果您需要方向变化检测,一个简单的 if/then/else 就足以选择正确的坐标用于方向。

#!/bin/bash
if [ "$(adb shell dumpsys power | grep mScreenOn= | grep -oE '(true|false)')" == false ] ; then
    echo "Screen is off. Turning on."
    adb shell input keyevent 26 # wakeup
    adb shell input touchscreen swipe 930 380 1080 380 # unlock
    echo "OK, should be on now."
else 
    echo "Screen is already on."
    echo "Turning off."
    adb shell input keyevent 26 # sleep
fi
于 2014-07-20T14:58:47.717 回答
10

这是一个 bash 脚本中的全部内容,它检查屏幕是否实际打开,然后唤醒一次性解锁屏幕:

if [ "$(adb shell dumpsys power | grep mScreenOn= | grep -oE '(true|false)')" == false ] ; then
    echo "Screen is off. Turning on."
    adb shell input keyevent 26 # wakeup
    adb shell input keyevent 82 # unlock
    echo "OK, should be on now."
else 
    echo "Screen is already on."
fi
于 2014-06-07T05:00:37.683 回答
6

您已经找到了解决方案,但无论如何我都会将此代码放在这里以供参考。

您可以做的是注入事件以“按下”电源按钮两次。如果您不知道设备的状态(显示打开/关闭),请检查屏幕当前是打开还是关闭,然后相应地按下电源按钮。

这是一个简单的monkeyrunner脚本:

import re
from java.util import *
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
device = MonkeyRunner.waitForConnection()       # connect to a device
device.shell("input keyevent KEYCODE_POWER")    # turn screen off (or on?)
res = device.shell("dumpsys power")             # fetch power state
m = re.search(r'.*mPowerState=([0-9]+).*', res) # parse the string
if m and int(m.group(1)) == 0:                  # screen is off
  device.shell("input keyevent KEYCODE_POWER")  # turn the screen on
于 2013-03-13T13:50:52.690 回答
5

除了之前的答案,这是我使用 adb 锁定/解锁屏幕的方法:

adb shell input keyevent 26将锁定屏幕。
因此,如果您再次执行该命令,当屏幕关闭/锁定时,它将被打开/解锁。
adb shell input keyevent 26还将解锁屏幕(如果屏幕已锁定)。

此外,我还测试了所有命令,例如adb shell input keyevent number, 并发现adb shell input keyevent 3也可以解锁设备。

我还发现(通过测试)键 3 是主页按钮。因此,如果您有一个物理主页按钮(不是屏幕上的软主页按钮),您也可以使用它来解锁您的设备。

于 2016-11-26T02:24:19.480 回答
1

对于那些使用早期版本的 android (至少 4.2+)的人来说,dumpsys power有不同的输出。我没有使用@Jakub Czaplicki给出的答案,
而是使用.mPowerState=mScreenOn=

p = Runtime.getRuntime().exec("su", null, null);
OutputStream o = p.getOutputStream();
o.write(("dumpsys power").getBytes("ASCII"));
o.flush();
o.close();
p.waitFor();

boolean screenState;
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((res = in.readLine()) != null) dump += res;
screenState = dump.charAt( dump.indexOf("mScreenOn=") + 10 ) == 't';

screenStatetrue (屏幕开启false (屏幕关闭

于 2014-04-02T11:41:30.320 回答
1

您可以使用以下命令触发显示开启。 adb shell 输入 keyevent POWER

我尝试并在我的项目中使用,希望它对你有用。

这是我使用的红宝石代码:

def ScreenCheck()
system("adb shell dumpsys power > c:/interact.log")

File.open("C:\\interact.log").each do |line|
    if line[/mScreenOn/]
        if line.strip == "mScreenOn=true"
            p "Screen is On, Starting execution.."
        else
            p "Screen is Off, starting screen.."
            system("adb shell input keyevent = POWER")
            p "Starting execution.."
        end
    end
end
end
于 2016-02-01T07:15:25.673 回答
1

这是一个脚本,用于为每个连接的设备(包括任何棒棒糖前设备)打开/关闭屏幕。在运行任何连接的 Android 测试之前,我在我的 Jenkins 服务器上使用它,以确保设备准备就绪。希望有人觉得这很有用!

#!/bin/sh

# Returns the power state of the screen 1 = on, 0 = off
getDisplayState() {
    state=$(adb -s $1 shell dumpsys power | grep mScreenOn= | grep -oE '(true|false)')

    # If we didn't get anything it might be a pre-lollipop device
    if [ "$state" = "" ]; then
        state=$(adb -s $1 shell dumpsys power | grep 'Display Power' | grep -oE '(ON|OFF)')
    fi

    if [ "$state" = "ON" ] || [ "$state" = "true" ]; then
        return 1;
    else
        return 0;
    fi
}

echo "Turning on screen on all connected devices..."

for device in `adb devices | grep device$ | cut -f1`
do
    echo -n "Found device: $device ... "

    getDisplayState $device
    state=$?

    # If the display is off, turn it on
    if [ $state -eq 0 ]; then
        echo "display was off, turning on"
        adb -s $device shell input keyevent 26
    else
        echo "display was on"
    fi

done
于 2017-06-24T21:58:51.027 回答