为什么我没有InputManager.getInstance()?和injectInputEvent()?

时间:2012-11-13 16:08:05

标签: java android

我正在尝试开发一种服务,在服务与某些硬件/远程服务器交互时向系统注入触摸事件。我用谷歌搜索过,每个人都建议使用InputManager类,引用Monkey作为示例项目。

但是,getInstance()中没有InputManager方法!我有权访问的内容正是documentation所显示的内容。没有getInstance()方法,最重要的是,没有injectInputEvent()方法。

我的构建目标SDK是Android 4.1.2,而我的AndroidManifest.xml文件指定目标SDK版本为16(我已经尝试将最小目标更改为16,这没有帮助(另外我喜欢如果可能,将其保持在8))。

我怎么能像猴子一样使用InputManager呢? Monkey正在使用哪些方法,为什么我不能使用它们?

3 个答案:

答案 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调用。