Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过ADB锁定Android屏幕?_Android_Adb_Screen Lock - Fatal编程技术网

如何通过ADB锁定Android屏幕?

如何通过ADB锁定Android屏幕?,android,adb,screen-lock,Android,Adb,Screen Lock,有没有办法通过ADB锁定Android屏幕 我找到了在apk中锁定显示的方法,但我想通过ADB从PC锁定屏幕,以模拟显示超时,而不必等待超时 有可能这样做吗 谢谢, 黛安很酷,我刚刚找到了26的钥匙密码 因此,它通过发送: adb shell input keyevent 26 如果屏幕未锁定,将锁定屏幕。如果屏幕已锁定,则会唤醒设备 我猜确保屏幕锁定(关闭)的唯一方法是解锁(我们使用keyevent 82(菜单),然后用电源按钮keyevent将其锁定。有人知道这是真的吗?您已经找到了解决方

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

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

有可能这样做吗

谢谢,
黛安

很酷,我刚刚找到了26的钥匙密码

因此,它通过发送:

adb shell input keyevent 26
如果屏幕未锁定,将锁定屏幕。如果屏幕已锁定,则会唤醒设备


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

您已经找到了解决方案,但我还是将此代码放在这里以供参考

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

下面是一个简单的monkeyrunner脚本:

重新导入
从java.util导入*
从com.android.monkeyrunner导入monkeyrunner、monkeyedevice
device=MonkeyRunner.waitForConnection()#连接到设备
device.shell(“输入键事件键码电源”)#关闭(或打开)屏幕
res=device.shell(“dumpsys电源”)#获取电源状态
m=re.search(r'.*mPowerState=([0-9]+)*,res)#解析字符串
如果m和int(m.group(1))==0:#屏幕关闭
device.shell(“input keyevent KEYCODE_POWER”)#打开屏幕

对于使用android早期版本(至少4.2+版本)的用户,
dumpsys-power
具有不同的输出。
我没有使用
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';

screenState
true
(screen打开)还是
false
(screen关闭)。

在一个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

MichaelR.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

您可以使用以下命令触发“打开显示”。 adb外壳输入键事件电源

我尝试并正在我的项目中使用,希望它能为你工作

下面是我使用的ruby代码:

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

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

adb外壳输入键事件26将锁定屏幕。
因此,如果再次执行该命令,当屏幕关闭/锁定时,它将打开/解锁。
adb外壳输入键事件26
也将解锁屏幕(如果屏幕被锁定)

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


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

这里有一个脚本,用于打开/关闭每个连接的设备的屏幕,包括任何棒棒糖前的设备。我在运行任何连接的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

mPowerState可能不是整数。在三星Galaxy SIII上,该行是:mPowerState=SCREEN\u BRIGHT\u BIT SCREEN\u On_BIT@Jakub:感谢您的回答!抱歉,我花了这么长时间才注意到。我几乎完全是通过Perl脚本使用adb命令和一些shell脚本来工作的。但是,当我需要做更多的工作时,我将把这些放在我的REF中以增强我的能力胡索:很高兴知道,谢谢。我使用的是测试手机,所以很高兴知道其中一款手机可能会有不同的表现。值得注意的是,自从安卓4.4W(API 20)以来,一直存在持续的键码睡眠,它解决了其中一个问题。“睡眠键。将设备置于睡眠状态。其行为有点像KEYCODE\u电源,但如果设备已处于睡眠状态,则无效。”"很好,我把它作为一个批处理文件放在windows桌面上,并添加了一个快捷键。不幸的是,它在cubietruck上起到断电的作用,只是关闭了设备。这很好。我也遇到了同样的问题——我正在使用的设备进入睡眠状态,没有任何硬键,所以我不得不一直重置它。有了这个,它就像一个唤醒up(按下“电源”按钮)。谢谢。它关闭/打开电源(与锁定/解锁相同?),但在一个设备(kitkat)中对我有效,在另一个设备(marshmellow)中失败。为什么你甚至建议如何解锁-当OP想要锁定设备时?你完全正确。我不知怎么错过了这一部分。后来我修改了脚本以反映所需的更改。谢谢@KurtcbainTouchScreen不是我手机上的命令Motorola Razr,它应该只是“滑动”而不是“触摸屏滑动”对棒棒糖来说似乎没有
mScreenOn,虽然Display power state=OFF/ON起作用,所以
tmp=“$(adb-s-s$udid shell dumpsys power | grep'mScreenOn=\\124; state''grep-oE'(true | false | ON | OFF)”
+
“adb shell input keyevent 82”在当前版本上不起作用?在配备Android 7的Nexus 6上,它起作用锁定/解锁与电源关闭/打开相同?它对我来说就像电源一样起作用