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

如何在Android中以编程方式解锁屏幕?,android,automation,Android,Automation,我正在开发一个基于JUnit的Android远程自动化测试框架(测试在Android外部运行,与内部代码交互)。这一切都运行得相当好,但我遇到的一个问题是,当我自动启动一个新的模拟器时,屏幕开始锁定。这似乎会影响我的测试是否能够运行,另外,我希望看到测试运行(单击按钮、键入文本等)。如果我手动启动一个模拟器并解锁它的屏幕,所有的工作都很好 有没有一种方法可以在Android中以编程方式解锁屏幕?Java API、命令行或shell命令等都可以。除此之外,也许有一种方法可以启动未锁定的仿真器?您可

我正在开发一个基于JUnit的Android远程自动化测试框架(测试在Android外部运行,与内部代码交互)。这一切都运行得相当好,但我遇到的一个问题是,当我自动启动一个新的模拟器时,屏幕开始锁定。这似乎会影响我的测试是否能够运行,另外,我希望看到测试运行(单击按钮、键入文本等)。如果我手动启动一个模拟器并解锁它的屏幕,所有的工作都很好


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

您可以通过它与仿真器交互

如果您曾经想知道为什么仿真器以5554这样的数字开始,那是因为仿真器监听的端口是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\u KEY:KEY\u菜单:1
为按键向下事件,
EV\u KEY:KEY\u菜单:0
为相应的按键向上事件。确保同时执行这两项操作,否则菜单键将被卡住

我意识到编写脚本远不是一件容易的事,但这是我能想到的解决您的问题的全部方法

编辑:我不认为
事件发送EV\u KEY:KEY\u菜单:1 EV\u KEY:KEY\u菜单:0
是模拟菜单,但如果我在启动模拟器后立即运行命令,它会解锁它。不知道为什么,但我想这是一个开始。

试试这个脚本:

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

我相信下面的链接有你想要的答案

解锁模拟器或设备

如果仿真器或设备的主屏幕被键盘保护模式禁用,您可能会发现UI测试不起作用。这是因为被测试的应用程序无法接收sendKeys()发送的密钥事件。避免这种情况的最好方法是先启动模拟器或设备,然后禁用主屏幕的键盘保护

您还可以显式禁用键盘保护。要做到这一点,您需要在清单文件(AndroidManifest.xml)中添加权限,然后在测试的应用程序中禁用keyguard。但是,请注意,您必须在发布应用程序之前删除此项,或者必须使用已发布应用程序中的代码禁用它

要添加权限,请将元素作为元素的子元素添加。要禁用KeyGuard,请将以下代码添加到要测试的活动的onCreate()方法中:

mKeyGuardManager=(KeyguardManager) getSystemService(键盘保护_服务);姆洛克= mKeyGuardManager.newKeyguardLock(“活动类名称”); mLock.disableKeyguard();其中activity_classname是的类名 活动


我使用shell成功地做到了这一点:

adb shell
#input keyevent 82

我在Android SDK r18和r20上与4.0.3(API 15)仿真器对话的一行代码:

adb shell input keyevent 82

解锁屏幕(假设没有密码)的最简单方法是传递KEYCODE_菜单事件;但是,如果屏幕已经解锁,这实际上会打开一个菜单,这可能不是您要寻找的功能

如果您想要一种简单的方法来保证屏幕在不意外打开菜单的情况下被解锁,那么您应该首先传入一个KEYCODE\u电源事件。这将保证设备处于锁定状态,因此菜单事件将仅解锁屏幕

adb shell input keyevent KEYCODE_POWER; adb shell input keyevent KEYCODE_MENU

(注意:出现在其他响应中的82是KEYCODE_MENU常量。)

您可以通过在命令提示符下运行此命令来锁定仿真器设备

adb shell input keyevent 26
adb shell input keyevent 82
通过在命令提示符下运行此命令,可以解锁仿真器设备

adb shell input keyevent 26
adb shell input keyevent 82
运行unlock命令后,您可能需要等待几分钟。
当您没有任何安全锁时,上述解锁命令将起作用。

对我不起作用。根据菜单按钮是KEY_SOFT1而不是KEY_Menu。我在我的1.5 AVD上测试了它,它似乎工作正常。KEY_SOFT1对您有用吗?在1.6图像上再次测试。使用“事件发送EV_密钥:密钥菜单:1 EV_密钥:密钥菜单:0”可以为我解锁新启动的AVD。但如果您再次运行它,它就不会模拟菜单键。我不确定它在做什么,但我想这仍然是解决问题的一种方法。圣诞节后我可能会花更长的时间看这个。SOFT1显然是我的菜单,但要解锁屏幕,我需要先按另一个键,例如HOME,然后按SOFT1。但是仍然不可靠,需要更多的调查。我以前用过这个,但我相信我有一个更可靠的解决方案:)对我不起作用。不知道为什么。我有一个i7500运行1.6。谢谢!这对我来说很管用,而其他很多人却没有。。。试过一个和你一样的,只有一行的,也没用+1注意:Oracle Linux 6(基本上是RHEL 6)附带的nc副本上没有选项-q1。我删除了它,脚本的结果对我来说没有改变。对于macosx也是一样,删除-q1,你就进入了!Thx这在很多方面都不好:代码现在已被弃用,还需要在被测应用程序的清单中具有权限。以下是在清单中匹配权限的可能解决方案:。但是,这对我来说不起作用-对我来说,调试/发布清单似乎没有被注入。除了在终端中键入之外,如何将其添加到我的Java代码脚本中?