如何在Android中以编程方式解锁屏幕?

时间:2009-12-24 16:56:04

标签: android automation

我正在开发基于JUnit的Android远程自动化测试框架(测试在android外部运行,与其中的代码进行交互)。这一切都运行得很好,但我遇到的一个问题是,当我自动启动一个新的模拟器时,屏幕开始锁定。这似乎会影响我的测试能够运行,而且,我想观看测试运行(点击按钮,输入文本等)。如果我手动启动模拟器并解锁其屏幕,一切正常。

有没有办法在Android中以编程方式解锁屏幕? Java API,命令行或shell命令等都可以。除此之外,也许有一种方法可以启动模拟器解锁?

7 个答案:

答案 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命令后,您可能需要等待几分钟。 当您没有任何安全锁时,上面的解锁命令将起作用。