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

我正在为基于JUnit的Android远程自动化testing框架(testing在android之外运行,与其中的代码交互)。 这一切都工作得很好,但我有一个问题是,当我自动启动一个新的模拟器,屏幕开始locking。 这似乎影响我的testing能够运行,另外,我想观察testing运行(button点击,文本input等)。 如果我手动启动一个模拟器并解锁它的屏幕,一切运作良好。

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

Solutions Collecting From Web of "如何在Android中以编程方式解锁屏幕?"

您可以通过其控制台界面与模拟器进行交互 。

如果你想知道你的模拟器为什么以5554这样的数字开始,那是因为这是模拟器监听的端口。

您可以使用adb devices命令find运行模拟器的端口。 它会有这样的输出:

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

所以你可以使用如下命令连接到模拟器:

 telnet localhost 5554 

如果你连接成功,你会得到一个OK提示,你可以开始input命令。

有各种命令,但我们感兴趣的是模拟硬件事件的事件。 我们可以用下面的命令按下我们模拟的菜单来解锁屏幕:

 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是仿真菜单,但如果我刚启动模拟器后运行命令它解锁它。 不知道为什么,但我想这是一个开始。

在Android SDK r18和r20上与我4.0.3(API 15)模拟器交谈的单线程:

 adb shell input keyevent 82 

我相信下面的链接有你正在寻找的答案。

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

解锁模拟器或设备

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

您也可以明确禁用键盘锁。 为此,您需要在清单文件(AndroidManifest.xml)中添加权限,然后在您的应用程序中禁用键盘锁。 但请注意,在发布应用程序之前,您必须先删除此代码,否则必须使用已发布应用程序中的代码禁用它。

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

mKeyGuardManager =(KeyguardManager)getSystemService(KEYGUARD_SERVICE); mLock = mKeyGuardManager.newKeyguardLock(“activity_classname”); mLock.disableKeyguard();其中activity_classname是活动的类名称。

试试这个脚本:

 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 

我设法使用shell来做到这一点:

 adb shell #input keyevent 82 

解锁屏幕最简单的方法(假设没有密码)是传递一个KEYCODE_MENU事件; 然而,如果屏幕已经解锁,这实际上会打开一个菜单,这可能不是你正在寻找的function。

如果你想要一个简单的方法来保证屏幕不会意外打开菜单,你应该首先传入一个KEYCODE_POWER事件。 这将保证设备处于locking状态,所以菜单事件只会解锁屏幕。

 adb shell input keyevent KEYCODE_POWER; adb shell input keyevent KEYCODE_MENU 

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

您可以通过从命令提示符运行此命令来locking您的仿真器设备

 adb shell input keyevent 26 

您可以通过从命令提示符处运行此命令来解锁您的仿真器设备

 adb shell input keyevent 82 

运行解锁命令后,可能需要等待几分钟。 上面的解锁命令将工作,当你没有任何安全锁。