Есть ли способ заблокировать экран Android через АБР?
Я нахожу способы блокировки отображения в apk, но я хочу заблокировать экран с ПК через ADB, чтобы имитировать тайм-аут отображения, не дожидаясь таймаута.
Можно ли это сделать?
Спасибо, Дайан
Есть ли способ заблокировать экран Android через АБР?
Я нахожу способы блокировки отображения в apk, но я хочу заблокировать экран с ПК через ADB, чтобы имитировать тайм-аут отображения, не дожидаясь таймаута.
Можно ли это сделать?
Спасибо, Дайан
Прохладный, я нашел KEYCODE_POWER
, который равен 26.
поэтому он работает, отправив:
adb shell input keyevent 26
который блокирует экран, если экран разблокирован. Если экран уже заблокирован, он пробуждает устройство.
Я предполагаю, что единственный способ убедиться, что экран заблокирован (выключен), - это разблокировать (мы используем keyevent 82 (menu), а затем запираем его клавишей с клавишей питания. Кто-нибудь есть идея, если это правда?
Майкл Р. Хайнс дал то, что, возможно, является самым простым решением. Однако следующая версия не подходит для более поздних версий Android.
adb shell input keyevent 82 # unlock
Я обновил оболочку script, используя координаты для отдельного устройства, которое я хочу проснуться (планшет). Мой планшет не поддерживает изменения ориентации для событий lockscreen, поэтому значения всегда работают, поскольку lockscreen всегда находится в ландшафте. Если вам требуется определение изменения ориентации, простое, если /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
Здесь все в одном bash script, которое проверяет, действительно ли экран включен или нет, а затем просыпается и разблокирует экран одним выстрелом:
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
Вы уже нашли решение, но я все равно поставлю этот код для справки.
Что вы можете сделать, это ввести событие, чтобы дважды нажать кнопку питания. Если вы не знаете статус устройства (включение/выключение дисплея), проверьте, включен или выключен экран, и нажмите кнопку питания соответственно.
Вот простой обезьянник script:
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
Для тех, кто использует более ранние версии android (как минимум, 4.2+), dumpsys power
имеет другой вывод.
Вместо использования mPowerState=
в качестве ответа, данного @Jakub Czaplicki, я использовал 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
(экран на) или false
(экран выключен).
Вы можете использовать следующую команду для включения отображения ВКЛ. входная плата adb keyentent 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
В дополнение к ответам раньше, вот что я делаю, чтобы заблокировать/разблокировать свой экран с помощью adb:
adb shell input keyevent 26
заблокирует экран.
Итак, если вы снова запустите эту команду, пока экран выключен/заблокирован, он будет включен/разблокирован. adb shell input keyevent 26
также разблокирует экран (если экран заблокирован).
Кроме того, я также проверил все команды, такие как adb shell input keyevent number
, и выяснил, что adb shell input keyevent 3
также разблокирует устройство.
Я также узнал (путем тестирования), что клавиша 3 является кнопкой "домой". Итак, если у вас есть кнопка физического дома (а не кнопка мягкого дома на экране), вы также можете использовать ее для разблокировки своего устройства.
Здесь script включает/выключает экран для каждого подключенного устройства, включая любые устройства с предварительным леоптипом. Я использую это на своем сервере Jenkins прямо перед запуском любых подключенных тестов Android, чтобы убедиться, что устройства готовы к работе. Надеюсь, кто-то найдет это полезным!
#!/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