2009-12-24 3 views
29

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

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

ответ

22

Вы можете взаимодействовать с эмулятором через его console interface.

Если вы когда-нибудь задумывались, почему ваш эмулятор начал с номера, например, 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 является соответствующим ключом до события. Убедитесь, что вы выполняете оба действия, или клавиша Menu будет нажата.

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

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

+1

Не работает для меня. В соответствии с http://bit.ly/6QjamY Кнопка меню - KEY_SOFT1, а не KEY_MENU. –

+1

Я протестировал его на своем 1.5 AVD, и он, похоже, работал нормально. Работает ли KEY_SOFT1 для вас? –

+0

Протестировано снова на 1,6-изображении. Использование «отправки события EV_KEY: KEY_MENU: 1 EV_KEY: KEY_MENU: 0" _does_ разблокировать недавно запущенный AVD для меня. Но если вы запустите его снова, это не эмуляция клавиши меню. Не уверен, что он делает, но я предполагаю, что это все еще какое-то решение проблемы. Вероятно, это займет больше времени после Рождества. –

6

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

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 
+0

Спасибо! Это работало для меня, когда многие другие не ...Пробовал один похожий на ваш, который был только одной строкой, также не работал. +1 – braden

+0

Примечание: опция -q1 отсутствовала на копии nc, которая поставляется с Oracle Linux 6 (по существу, RHEL 6). Я удалил его, и результат скрипта не изменился для меня. – braden

+0

то же самое для macosx, удалите -q1, и вы в! Thx – Snicolas

12

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

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

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

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

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

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

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

+0

Это плохо по-разному: код теперь устарел, также требуется разрешение в манифесте тестируемого приложения. Вот вероятное решение для опускания разрешения в манифесте: http://stackoverflow.com/a/23223142/1108032. Однако это не работает для меня - мне кажется, что отладочные/релизные манифесты не вводятся. –

4

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

adb shell 
#input keyevent 82 
+0

Подтверждено. Оно работало завораживающе! :-) –

+0

Не работал для меня. Не знаю, почему. У меня i7500 работает 1.6. – ashes999

+0

Не работал на 3 телефонах, которые я пробовал. – tomwhipple

18

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

adb shell input keyevent 82 
5

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

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

adb shell input keyevent KEYCODE_POWER; adb shell input keyevent KEYCODE_MENU 

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

0

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

adb shell input keyevent 26 

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

adb shell input keyevent 82 

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

+0

Как добавить его в мой скрипт Java-кода, кроме ввода в терминал? –

Смежные вопросы