TV获取按键只需
1. 使用Instrumentation
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
或者
public static void simulateKeyEvent(final int KeyCode) {
new Thread(new Runnable() {
public void run() {
// 开线程调用方法
try {
Instrumentation inst=new Instrumentation();
inst.sendKeyDownUpSync(KeyCode);
} catch (Exception e) {
// 异常catch
}
}
}).start();
}
上面介绍的简单方法以Service的形式开启,在单个进程和单个应用中使用是没有问题的,但是当按Home键或者其他方式退出当前应用之后,虽然service还在,但是上述的方法无法执行:Injecting to another application requires INJECT_EVENTS permission,
提示没有权限,但是在AndroidManifest.xml中加上权限之后,仍然无法解决问题。
解决方法
解决该问题的关键是为当前应用的id变成系统级别的,可以理解成获取系统权限,解决方法围绕这点展开
- 在应用程序的AndroidManifest.xml中的manifest节点中加入
android:sharedUserId=”android.uid.system”这个属性。 - 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
- 源码下使用mm命令来编译,生成的apk就有系统的权限。
查看sendPointerSync()
方法的源码会看到,它使用的是 injectInputEvent()
方法实现:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
使用Instrumentation需要<uses-permission android:name="android.permission.INJECT_EVENTS"/>
权限,并且跨App注入事件需要系统应用(AndroidManifest.xml 中加入android:sharedUserId="android.uid.system"
)并且平台签名才行。
2. 使用反射直接调用injectInputEvent()
方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
3.使用Runtime.exec 执行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
或者直接:
- 1
4. 针对特定的应用可以使用Android Accessibility
5. 可以直接使用Adb shell
- 1
- 2
6.monkeyrunner是一个功能更为丰富的选项,不过需要连接电脑
参考链接:
1. http://azard.me/blog/2015/06/13/android-cross-app-touch-event-injection/
2. http://blog.csdn.net/mad1989/article/details/38109689
3. http://www.race604.com/android-inject-input-event/