Как я могу разблокировать экран программно в Android? - PullRequest
29 голосов
/ 24 декабря 2009

Я работаю над платформой удаленного автоматического тестирования для Android на основе JUnit (тесты выполняются вне android, взаимодействуя с кодом внутри него). Все работает довольно хорошо, но у меня есть одна проблема: когда я автоматически запускаю новый эмулятор, экран начинает блокироваться. Похоже, это влияет на возможность выполнения моих тестов, плюс я хочу наблюдать за выполнением тестов (нажатие кнопок, ввод текста и т. Д.). Если я вручную запускаю эмулятор и разблокирую его экран, все работает хорошо.

Есть ли способ программно разблокировать экран в Android? Java API, командная строка или командная оболочка и т. Д. - все в порядке. Кроме этого, возможно, есть способ запустить разблокированный эмулятор?

Ответы [ 7 ]

22 голосов
/ 24 декабря 2009

Вы можете взаимодействовать с эмулятором через интерфейс консоли .

Если вы когда-нибудь задумывались, почему ваш эмулятор начинался с номера, например 5554, - это потому, что это порт, который слушает эмулятор.

Вы можете найти порт для запуска эмуляторов с помощью команды adb devices. Он будет иметь следующий вывод:

C:\>adb devices
List of devices attached
emulator-5554   device

Таким образом, вы можете подключиться к эмулятору с помощью команды вроде:

telnet localhost 5554

При успешном подключении вы получите приглашение OK и сможете начать вводить команды.

Существуют различные команды, но нас интересует event для имитации аппаратных событий. Мы можем разблокировать экран, нажав Меню , которое мы эмулируем с помощью следующей команды:

event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0

EV_KEY:KEY_MENU:1 - это событие нажатия клавиши, а EV_KEY:KEY_MENU:0 - соответствующее событие нажатия клавиши. Удостоверьтесь, что вы делаете и то и другое, иначе клавиша меню застрянет.

Я понимаю, что писать сценарии будет непросто, но это все, что я могу придумать, чтобы решить вашу проблему.

Редактировать: Я не думаю, что event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0 эмулирует Меню , но если я запускаю команду сразу после запуска эмулятора, делает разблокировать его Не знаю почему, но я думаю, это начало.

18 голосов
/ 06 августа 2012

Однострочник, который работает для меня на Android SDK r18 и r20, общается с эмулятором 4.0.3 (API 15):

adb shell input keyevent 82
12 голосов
/ 13 января 2011

Я полагаю, что следующая ссылка содержит ответ, который вы ищете.

http://developer.android.com/guide/topics/testing/activity_testing.html#UnlockDevice

Разблокировка эмулятора или устройства

Вы можете обнаружить, что тесты пользовательского интерфейса не работают, если домашний экран эмулятора или устройства отключен с помощью шаблона клавиатуры. Это связано с тем, что тестируемое приложение не может получать ключевые события, отправленные sendKeys (). Лучший способ избежать этого - сначала запустить эмулятор или устройство, а затем отключить защиту клавиатуры на домашнем экране.

Вы также можете явно отключить защиту клавиатуры. Для этого вам нужно добавить разрешение в файл манифеста (AndroidManifest.xml), а затем отключить защиту клавиатуры в тестируемом приложении. Обратите внимание, что вы должны либо удалить это, прежде чем публиковать приложение, либо отключить его с помощью кода в опубликованном приложении.

Чтобы добавить разрешение, добавьте элемент в качестве дочернего элемента. Чтобы отключить KeyGuard, добавьте следующий код в метод onCreate () действий, которые вы собираетесь тестировать:

mKeyGuardManager = (KeyguardManager) getSystemService (KEYGUARD_SERVICE); млок = mKeyGuardManager.newKeyguardLock ( "activity_classname"); mLock.disableKeyguard (); где activity_classname - это имя класса деятельность.

6 голосов
/ 02 октября 2010

Попробуйте этот скрипт:

echo "event send EV_KEY:KEY_SOFT1:1" | nc -q1 localhost 5554
sleep 0.1
echo "event send EV_KEY:KEY_SOFT1:0" | nc -q1 localhost 5554
sleep 0.1
echo "event send EV_KEY:KEY_SOFT1:1" | nc -q1 localhost 5554
sleep 0.1
echo "event send EV_KEY:KEY_SOFT1:0" | nc -q1 localhost 5554
sleep 0.1
5 голосов
/ 06 февраля 2015

Самый простой способ разблокировки экрана (при условии отсутствия пароля) - передать событие KEYCODE_MENU; однако, если экран уже разблокирован, это фактически откроет меню, которое, вероятно, не соответствует нужной вам функциональности.

Если вы хотите простой способ гарантировать, что экран будет разблокирован без случайного открытия меню, вы должны сначала передать событие KEYCODE_POWER. Это гарантирует, что устройство находится в заблокированном состоянии, поэтому событие меню только разблокирует экран.

adb shell input keyevent KEYCODE_POWER; adb shell input keyevent KEYCODE_MENU

(Примечание: 82, которое появляется в других ответах, является константой KEYCODE_MENU.)

4 голосов
/ 28 февраля 2012

Мне удалось сделать это с помощью оболочки:

adb shell
#input keyevent 82
0 голосов
/ 27 октября 2016

Вы можете заблокировать устройство эмулятора, запустив эту команду из командной строки

adb shell input keyevent 26

Вы можете разблокировать устройство эмулятора, выполнив эту команду из командной строки

adb shell input keyevent 82

После запуска команды разблокировки вам, возможно, придется подождать несколько минут. Выше команда разблокировки будет работать, когда у вас нет блокировки безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...