【问题标题】:How can I unlock the screen programmatically in Android?如何在 Android 中以编程方式解锁屏幕?
【发布时间】:2010-12-29 20:42:49
【问题描述】:

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

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

【问题讨论】:

    标签: android automation


    【解决方案1】:

    您可以通过其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 正在模拟 Menu 但如果我在启动模拟器后运行该命令 确实 解锁它。不知道为什么,但我想这是一个开始。

    【讨论】:

    • 对我不起作用。根据bit.ly/6QjamY 菜单按钮是KEY_SOFT1 而不是KEY_MENU。
    • 我在我的 1.5 AVD 上对其进行了测试,它似乎工作正常。 KEY_SOFT1 是否适合您?
    • 在 1.6 图像上再次测试。使用“事件发送 EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0”确实为我解锁了新推出的 AVD。但是如果你再次运行它,它不会模拟菜单键。不知道它在做什么,但我想它仍然是解决问题的一种方法。圣诞节后可能会花更长的时间看看这个。
    • SOFT1 显然是我的菜单,但要解锁屏幕我需要先按另一个键,例如HOME,然后是 SOFT1。不过仍然不可靠,需要更多调查。
    • 我曾经使用过这个,但相信我有一个更可靠的解决方案:) stackoverflow.com/questions/3214531/#3366443
    【解决方案2】:

    试试这个脚本:

    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
    

    【讨论】:

    • 谢谢!当许多其他人没有时,这对我有用...尝试了与您类似的一种,它只是一条线,也没有用。 +1
    • 注意:选项 -q1 不存在于 Oracle Linux 6(本质上是 RHEL 6)附带的 nc 副本中。我删除了它,脚本的结果对我来说没有改变。
    • macosx 也一样,去掉 -q1 就可以了!谢谢
    【解决方案3】:

    我相信以下链接有您正在寻找的答案。

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

    解锁模拟器或设备

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

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

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

    mKeyGuardManager = (KeyguardManager) 获取系统服务(KEYGUARD_SERVICE);锁定 = mKeyGuardManager.newKeyguardLock("activity_classname"); mLock.disableKeyguard();其中activity_classname是类名 活动。

    【讨论】:

    • 这在很多方面都很糟糕:代码现在已被弃用,还需要在被测应用的清单中获得权限。这是在清单中省略权限的可能解决方案:stackoverflow.com/a/23223142/1108032。但是,这对我不起作用 - 对我来说,调试/发布清单似乎没有被注入
    【解决方案4】:

    我设法使用 shell 做到了:

    adb shell
    #input keyevent 82
    

    【讨论】:

    • 对我不起作用。不知道为什么。我有一台运行 1.6 的 i7500。
    【解决方案5】:

    适用于我在 Android SDK r18 和 r20 上与 4.0.3 (API 15) 模拟器对话的单线器:

    adb shell input keyevent 82
    

    【讨论】:

      【解决方案6】:

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

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

      adb shell input keyevent KEYCODE_POWER; adb shell input keyevent KEYCODE_MENU
      

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

      【讨论】:

        【解决方案7】:

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

        adb shell input keyevent 26
        

        您可以通过在命令提示符下运行此命令来解锁您的模拟器设备

        adb shell input keyevent 82
        

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

        【讨论】:

        • 除了在终端中输入之外,如何将其添加到我的 Java 代码脚本中?
        猜你喜欢
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 2011-02-28
        • 2011-04-05
        相关资源
        最近更新 更多