我在基本测试类中声明了以下KeyEvent,用于在应用程序的Android设备上运行的自动化套件。

private static final KeyEvent pressPowerDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_POWER);
private static final KeyEvent pressPowerUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_POWER);


然后,我确定在Android Test上下文中正在运行什么活动,并将该上下文强制转换为活动以触发事件:

if (_context instanceof Activity) {
    Activity activity = (Activity) _context;
    activity.dispatchKeyEvent(pressPowerDown);
    activity.dispatchKeyEvent(pressPowerUp);


在自动化过程中检查设备时,上述KeyEvent不会触发。
我读了关于KeyListenerssimulating KeyEvents的信息,但是我在这里想做的并不完全属于这些类别之一(不是使用Robot,而是使用具有自己的Activity的内部测试框架)。

我最初的想法是我需要重新调整活动的重点,但是现在我开始认为我需要某种KeyListener,由于这是一个测试套件,而不是接口类,因此我不确定将其放置在何处;它根本没有任何与之关联的接口!

如果有人知道如何在其他程序中创建和触发KeyEvent,则鉴于我们无权访问其内部机制(无法修改内部测试工具-只能修改当前测试套件的运行状态),不胜感激。

编辑:我测试过尝试将其触发三次之后是否查看了KeyEvent:

System.out.println("Was the event consumed? " + activity.dispatchKeyEvent(pressPowerUp))


它从未被解雇,这使我相信我们需要某种听众。如果有人对如何在一个类中实现侦听器有任何想法,或者允许我声明一个侦听器类并覆盖“ dispatchKeyEvent”方法,那将是一个很大的帮助。

最佳答案

一旦我从其他开发人员那里得到了一些更好的反馈,答案实际上有点复杂,但还算不错。参见说明here,但是对于那些不想离开页面的人,基本上可以这样做:

import java.lang.Process;
import java.lang.Runtime;

// your code here
String keyPower = "input keyevent " + KeyEvent.KEYCODE_POWER;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(keyPower);


简单化,但无论关注什么活动,它都能完成。

关于java - 您如何在Android自动化 Activity 中触发Java KeyEvent?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22817235/

10-12 06:04