web-dev-qa-db-ja.com

ADBを介してAndroid画面をロックするには?

ADB経由でAndroid画面をロックする方法はありますか?

Apkでディスプレイをロックする方法を見つけましたが、ADBを介してPCから画面をロックして、タイムアウトを待つことなくディスプレイタイムアウトをシミュレートしたいと思います。

これを行うことは可能ですか?

ありがとう、ダイアン

43
PurpleDiane

かっこいい、ただ見つけたKEYCODE_POWERは26です。

以下を送信することで動作します:

adb Shell input keyevent 26

画面のロックが解除されると画面がロックされます。画面がすでにロックされている場合、デバイスを起動します。

私の推測では、画面がロック(オフ)されていることを確認する唯一の方法は、ロックを解除(keyevent 82(メニュー)を使用してから、電源ボタンkeyeventでロックすることです。

65
PurpleDiane

Michael R. Hinesが、おそらく最も簡単なソリューションを提供しました。ただし、以降のバージョンのAndroidでは次の行は役に立ちません。

adb Shell input keyevent 82 # unlock

起動したい個々のデバイス(タブレット)の座標を使用してシェルスクリプトを更新しました。私のタブレットはロック画面イベントの向きの変更をサポートしていないため、ロック画面は常に横向きであるため、値は常に機能します。向きの変更の検出が必要な場合、向きに使用する正しい座標を選択するには、単純な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
15
Rescue9

画面が実際にオンかどうかを確認してから目を覚ますandで画面を一度にロック解除する1つの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
9

解決策は既に見つかりましたが、とにかく参照用にこのコードをここに配置します。

あなたができることは、電源ボタンを2回「押す」イベントを注入することです。デバイスのステータスがわからない場合(ディスプレイのオン/オフ)、画面が現在オンまたはオフになっているかどうかを確認し、それに応じて電源ボタンを押します。

簡単な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
5
Jakub Czaplicki

以前の回答に加えて、adbを使用して画面をロック/ロック解除するために行うことは次のとおりです。

adb Shell input keyevent 26は画面をロックします。
したがって、そのコマンドを再度実行すると、画面がオフ/ロックされている間に、オン/ロック解除されます。
adb Shell input keyevent 26は、画面のロックも解除します(画面がロックされている場合)。

さらに、adb Shell input keyevent numberなどのすべてのコマンドもテストしましたが、adb Shell input keyevent 3もデバイスのロックを解除することがわかりました。

また、(テストにより)キー3がホームボタンであることもわかりました。したがって、物理的なホームボタン(画面上のソフトホームボタンではない)がある場合は、これを使用してデバイスのロックを解除することもできます。

3
Lloyd Dominic

次のコマンドを使用して、表示オンをトリガーできます。 adb Shell input keyevent POWER

私は私のプロジェクトで試し、使用しています。それがあなたのために働くことを願っています。

そして、これは私が使用した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
1
Swapan Chhabra

以前のバージョンの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(screenon、またはfalse(screenoff

1

以下は、Lollipop以前のデバイスを含む、接続されているすべてのデバイスの画面をオンまたはオフにするスクリプトです。接続済みの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
0
Victor Rendina