我正在开发基于JUnit的Android远程自动化测试框架(测试在android外部运行,与其中的代码进行交互)。这一切都运行得很好,但我遇到的一个问题是,当我自动启动一个新的模拟器时,屏幕开始锁定。这似乎会影响我的测试能够运行,而且,我想观看测试运行(点击按钮,输入文本等)。如果我手动启动模拟器并解锁其屏幕,一切正常。
有没有办法在Android中以编程方式解锁屏幕? Java API,命令行或shell命令等都可以。除此之外,也许有一种方法可以启动模拟器解锁?
答案 0 :(得分:22)
您可以通过其console interface与模拟器进行互动。
如果你想知道为什么你的模拟器开始使用像5554这样的数字 - 那是因为那是模拟器监听的端口。
您可以使用adb devices
命令找到运行仿真器的端口。它将具有如下输出:
C:\>adb devices
List of devices attached
emulator-5554 device
因此,您可以使用如下命令连接到模拟器:
telnet localhost 5554
如果连接成功,您将收到OK
提示,您可以开始输入命令。
有各种命令,但我们感兴趣的是event
来模拟硬件事件。我们可以通过按下以下命令模拟的 Menu 来解锁屏幕:
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
正在模仿菜单,但如果我在启动模拟器后立即运行命令 解锁它。不知道为什么,但我想这是一个开始。
答案 1 :(得分:18)
适用于Android SDK r18和r20的单线程与4.0.3(API 15)模拟器通信:
adb shell input keyevent 82
答案 2 :(得分:12)
我相信以下链接有您正在寻找的答案。
http://developer.android.com/guide/topics/testing/activity_testing.html#UnlockDevice
解锁仿真器或设备
如果使用键盘锁模式禁用了模拟器或设备的主屏幕,您可能会发现UI测试不起作用。这是因为受测试的应用程序无法接收sendKeys()发送的关键事件。避免这种情况的最佳方法是首先启动模拟器或设备,然后禁用主屏幕的键盘锁。
您还可以明确禁用键盘锁。为此,您需要在清单文件(AndroidManifest.xml)中添加权限,然后在要测试的应用程序中禁用键盘锁。但请注意,您必须在发布应用程序之前删除它,或者必须使用已发布应用程序中的代码禁用它。
要添加权限,请将元素添加为元素的子元素。要禁用KeyGuard,请将以下代码添加到要测试的活动的onCreate()方法中:
mKeyGuardManager =(KeyguardManager) getSystemService(KEYGUARD_SERVICE); mLock = mKeyGuardManager.newKeyguardLock( “activity_classname”); mLock.disableKeyguard();其中activity_classname是类的名称 活动。
答案 3 :(得分: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
答案 4 :(得分:5)
解锁屏幕的最简单方法(假设没有密码)是传递KEYCODE_MENU事件;但是,如果屏幕已经解锁,这实际上会打开一个菜单,这可能不是您正在寻找的功能。
如果您想要一种简单的方法来保证在不打开菜单的情况下解锁屏幕,您应首先传入KEYCODE_POWER事件。这将保证设备处于锁定状态,因此菜单事件将仅解锁屏幕。
adb shell input keyevent KEYCODE_POWER; adb shell input keyevent KEYCODE_MENU
(注意:其他响应中出现的82是KEYCODE_MENU常量。)
答案 5 :(得分:4)
我设法使用shell:
adb shell
#input keyevent 82
答案 6 :(得分:0)
您可以通过从命令提示符
运行此命令来锁定仿真器设备adb shell input keyevent 26
您可以通过从命令提示符
运行此命令来解锁您的仿真器设备adb shell input keyevent 82
运行unlock命令后,您可能需要等待几分钟。 当您没有任何安全锁时,上面的解锁命令将起作用。