通过代码模拟触摸控制
Simulate Touch Controls Through Code
我正在尝试通过使用头部动作来浏览我的 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
解决方案
最后我选择了与我在上面的编辑中提到的不同的方向。
我发现可以使用
在 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 会起作用。
这可以通过以下步骤完成:
- 在您的 activity
中创建并发起话题
- 在 运行 方法中,使用
Looper
class 并按照 here 的说明创建一个 Handler
- 每次您想调用
sendKeyDownUpSync
,post 一个 Runnable
实例到 Handler
,后者在其 [=18= 中调用 sendKeyDownUpSync
]方法。
有类似的代码示例(不是我的)可用 here
我正在尝试通过使用头部动作来浏览我的 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
解决方案
最后我选择了与我在上面的编辑中提到的不同的方向。
我发现可以使用
在 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 会起作用。
这可以通过以下步骤完成:
- 在您的 activity 中创建并发起话题
- 在 运行 方法中,使用
Looper
class 并按照 here 的说明创建一个 - 每次您想调用
sendKeyDownUpSync
,post 一个Runnable
实例到Handler
,后者在其 [=18= 中调用sendKeyDownUpSync
]方法。
Handler
有类似的代码示例(不是我的)可用 here