我正在尝试开发一种服务,在服务与某些硬件/远程服务器交互时向系统注入触摸事件。我用谷歌搜索过,每个人都建议使用InputManager
类,引用Monkey作为示例项目。
但是,getInstance()
中没有InputManager
方法!我有权访问的内容正是documentation所显示的内容。没有getInstance()
方法,最重要的是,没有injectInputEvent()
方法。
我的构建目标SDK是Android 4.1.2,而我的AndroidManifest.xml文件指定目标SDK版本为16(我已经尝试将最小目标更改为16,这没有帮助(另外我喜欢如果可能,将其保持在8))。
我怎么能像猴子一样使用InputManager
呢? Monkey正在使用哪些方法,为什么我不能使用它们?
答案 0 :(得分:2)
您无法将输入事件从其他应用程序注入一个应用程序。此外,您无法从应用程序中向自己的应用程序注入事件。 https://groups.google.com/forum/?fromgroups=#!topic/android-developers/N5R9rMJjgzk%5B1-25%5D
如果要自动化,可以使用monkeyrunner脚本执行相同的操作。
答案 1 :(得分:1)
Class cl = InputManager.class;
try {
Method method = cl.getMethod("getInstance");
Object result = method.invoke(cl);
InputManager im = (InputManager) result;
method = cl.getMethod("injectInputEvent", InputEvent.class, int.class);
method.invoke(im, event, 2);
}
catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 2 :(得分:0)
也许这有点晚,但可能有助于将来参考。
方法1:使用检测对象
public static void changeState(Text control,final int style)
{
if (SWT.ENABLED == (style & SWT.ENABLED)) {
MyService.setState(control, SWT.ENABLED);
}
if (SWT.DISABLED == (style & SWT.DISABLED)) {
MyService.setState(control, SWT.DISABLED);
}
if(SWT.READ_ONLY == (style & SWT.READ_ONLY)){
MyService.setState(control, SWT.READ_ONLY);
}
}
方法2:使用带反射的内部API
此方法使用反射来访问内部API。
Instrumentation instrumentation = new Instrumentation();
instrumentation.sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
instrumentation.sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
请注意,方法1 是一个基于公共API的干净解决方案,在内部它使用来自方法2 的相同调用。
另请注意,这两种方法都不能从MainThread调用。