通过代码模拟触控控制

3
我正在尝试使用头部手势来实现通过Google Glass应用程序进行导航。我能够识别向右、向左和向上看等头部手势。每个手势被识别后都有各自的方法来执行相应操作。
现在,我需要在每个方法中模拟相应的触摸手势,以便它会认为我正在向左或向右滑动,这将使我能够通过头部手势浏览卡片。
有人知道如何实现这一点吗?

编辑

我创建了一个快速的“Hello World”应用程序来进行测试。我添加了我的头部手势代码,并开始尝试让键盘工作。
我在onCreate()中添加了以下内容:
Instrumentation instr = new Instrumentation();

然后我将以下行添加到每个相应的头部手势方法中。
  • 向上的头部手势应该对应于点击触摸板inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER)
  • 向左的头部手势应该对应于在触摸板上向左滑动inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_LEFT);
  • 向右的头部手势应该对应于在触摸板上向右滑动inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_RIGHT);

现在它们正在按照预期响应,但是我收到了一个异常,内容如下:

 java.lang.RuntimeException: This method can not be called from the main application thread

只需在后台线程中使用它们。 - Simon Marquis
@SimonMarquis 你说得对,我本来可以走那条路,但我选择了另一种方式。我也在思考哪种方案是最佳实践,如果你有任何意见,我很愿意听取。 - NoSixties
2个回答

0

如果您使用单独的线程调用sendKeyDownUpSync方法,则可以使用Instrumentation类。

可以通过以下步骤完成:

  1. 从活动中创建并启动一个线程
  2. 在运行方法中,如here所述,使用Looper类并创建一个Handler
  3. 每当您想调用sendKeyDownUpSync时,请将Runnable实例发送到Handler,该实例在其run方法中调用sendKeyDownUpSync

类似的代码示例(不是我写的)可在here找到。


0

解决方案

最终,我选择了与我在上面编辑中提到的不同方向。

我发现可以通过使用 shell 调用触摸控件。

adb shell input keyevent <keycode here>

然后我找到了一种在Android中使用它的方法,我有以下名为issueKey的类

public class issueKey {
public void issueKey(int keyCode)
{
    try {
        java.lang.Process p = java.lang.Runtime.getRuntime().exec("input keyevent " + Integer.toString(keyCode) + "\n");
    } catch (Exception e) {
        Log.wtf("IssueKeyError", e.getMessage());
    }
}
}

然后我只需调用该类并传递相应手势的按键代码

mIssueKey.issueKey(4);//functions as swipe down

以下是我测试过的按键代码列表,供有兴趣的人参考。

各个按钮/手势所对应的按键

  • 4:向下滑动手势
  • 21:向左滑动手势
  • 22:向右滑动手势
  • 23:轻触屏幕手势
  • 24:增加音量按键
  • 25:减小音量按键
  • 26:锁定/解锁屏幕按键
  • 27:相机按键

然而,我现在想知道的是,使用asyncTask让我在编辑中提到的解决方案能否得到很好的实现,还是我当前使用的解决方案更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接