通过代码模拟触摸控制

Simulate Touch Controls Through Code

我正在尝试通过使用头部动作来浏览我的 Google Glass 应用程序。我能够识别头部动作,比如左右看和向上看。当这个手势被识别时,他们每个人都有自己的方法

现在我需要在每个方法中模拟相应的触摸手势。所以它会认为我正在向左或向右滑动,这样我就可以用头部手势浏览卡片。

有没有人知道如何真正做到这一点?


编辑

我创建了一个快速的 hello world 应用程序来玩。我添加了手势代码并开始尝试让按键正常工作。

我将以下内容添加到我的 onCreate()

Instrumentation instr = new Instrumentation();

然后我将以下几行添加到每个相应的手势方法中。

他们现在正在做出相应的回应,但是我收到一个例外:

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

解决方案

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

我发现可以使用

在 shell 中调用触摸控件
adb shell input keyevent <keycode here>

然后我在 android 中找到了使用它的方法,我有以下 class 名为 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());
    }
}
}

然后我只需调用 class 并传递相应手势的键码

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

这是我为任何感兴趣的人测试的键码列表。

每个 button/gesture

的键
  • 4: 向下滑动
  • 21:向左滑动
  • 22:向右滑动
  • 23: 点击
  • 24: 提高音量
  • 25: 降低音量
  • 26: Lock/Unlock 屏幕
  • 27: 相机按钮

但是,我现在想知道的是。什么是最佳实践,让我在编辑中提到的解决方案通过使用 asyncTask 来工作,或者是我目前使用的更好的解决方案。

如果您使用单独的线程从中调用 sendKeyDownUpSync 方法,则使用 Instrumentation class 会起作用。

这可以通过以下步骤完成:

  1. 在您的 activity
  2. 中创建并发起话题
  3. 在 运行 方法中,使用 Looper class 并按照 here
  4. 的说明创建一个 Handler
  5. 每次您想调用 sendKeyDownUpSync,post 一个 Runnable 实例到 Handler,后者在其 [=18= 中调用 sendKeyDownUpSync ]方法。

有类似的代码示例(不是我的)可用 here