使用源码来编译出一个可以发送模拟按键的app
最近一个项目, 需要将车上的按键转化为导航主机的操作, 比如奥迪的MMI, 奔驰的Comond, 宝马的iDriver, 思考了一下, 决定采用转化物理按键为键盘消息的方法来操作导航主机的功能, 当然, 这里的导航主机指的是Android的导航主机:
- 权限,属性
- 代码编写
- 签名
- 打包,运行
按键值对照表
权限,属性
需要用到的权限及设置的属性:
android:sharedUserId="android.uid.system"
<uses-permission android:name="android.permission.INJECT_EVENTS"
由于需要发出按键, 所以需要共享使用系统的uid, 同时需要按键注入的权限
- 代码编写
- 接下来就是写一个apk来进行按键分发工作了,这里先编写AndroidManifest.xml文件,如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zaijzhgh.www.simulatorkeypad"
android:sharedUserId="android.uid.system">
<uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>
然后在文件中添加一个方法, 用来发送按键:
public static void sendKeyEvent(final int KeyCode) {
new Thread() { //不可在主线程中调用,所以这里使用线程发送
public void run() {
try {
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
签名
编译出来的apk需要使用系统的签名文件进行签名, 才能被使用,否则会出现打包进去了却无法显示出来的问题.
这里需要用到platform.pk8和platform.x509.pem这两个签名文件,通常在源码环境的build\target\product\security目录下
同时还需要用到signapk.jar文件, 通常在out/host/linux-x86/framework目录下打包,运行
签名完毕后, 拷贝after_signed.apk至out/target/product/generic/system/app目录下
执行make snod命令(在这之前需要先执行source build/envsetup.sh , lunch指令)
然后使用emulator来启动模拟器, 即可看到打包进system app的应用了.有了这两个文件后, 可以执行命令java -jar signapk.jar platform.x509.pem platform.pk8 before_sign.apk after_signed.apk, 这里before_sign.apk为需要签名的apk, after_signed.apk为签名后的apk
按键值对照表
这里的KeyCode可以根据下面的按键值对应表来查找:
按键名称 | 按键值 |
---|---|
KEYCODE_UNKNOWN | 0 |
KEYCODE_SOFT_LEFT | 1 |
KEYCODE_SOFT_RIGHT | 2 |
KEYCODE_HOME | 3 |
KEYCODE_BACK | 4 |
KEYCODE_CALL | 5 |
KEYCODE_ENDCALL | 6 |
KEYCODE_0 | 7 |
KEYCODE_1 | 8 |
KEYCODE_2 | 9 |
KEYCODE_3 | 10 |
KEYCODE_4 | 11 |
KEYCODE_5 | 12 |
KEYCODE_6 | 13 |
KEYCODE_7 | 14 |
KEYCODE_8 | 15 |
KEYCODE_9 | 16 |
KEYCODE_STAR | 17 |
KEYCODE_POUND | 18 |
KEYCODE_DPAD_UP | 19 |
KEYCODE_DPAD_DOWN | 20 |
KEYCODE_DPAD_LEFT | 21 |
KEYCODE_DPAD_RIGHT | 22 |
KEYCODE_DPAD_CENTER | 23 |
KEYCODE_VOLUME_UP | 24 |
KEYCODE_VOLUME_DOWN | 25 |
KEYCODE_POWER | 26 |
KEYCODE_CAMERA | 27 |
KEYCODE_CLEAR | 28 |
KEYCODE_A | 29 |
KEYCODE_B | 30 |
KEYCODE_C | 31 |
KEYCODE_D | 32 |
KEYCODE_E | 33 |
KEYCODE_F | 34 |
KEYCODE_G | 35 |
KEYCODE_H | 36 |
KEYCODE_I | 37 |
KEYCODE_J | 38 |
KEYCODE_K | 39 |
KEYCODE_L | 40 |
KEYCODE_M | 41 |
KEYCODE_N | 42 |
KEYCODE_O | 43 |
KEYCODE_P | 44 |
KEYCODE_Q | 45 |
KEYCODE_R | 46 |
KEYCODE_S | 47 |
KEYCODE_T | 48 |
KEYCODE_U | 49 |
KEYCODE_V | 50 |
KEYCODE_W | 51 |
KEYCODE_X | 52 |
KEYCODE_Y | 53 |
KEYCODE_Z | 54 |
KEYCODE_COMMA | 55 |
KEYCODE_PERIOD | 56 |
KEYCODE_ALT_LEFT | 57 |
KEYCODE_ALT_RIGHT | 58 |
KEYCODE_SHIFT_LEFT | 59 |
KEYCODE_SHIFT_RIGHT | 60 |
KEYCODE_TAB | 61 |
KEYCODE_SPACE | 62 |
KEYCODE_SYM | 63 |
KEYCODE_EXPLORER | 64 |
KEYCODE_ENVELOPE | 65 |
KEYCODE_ENTER | 66 |
KEYCODE_DEL | 67 |
KEYCODE_GRAVE | 68 |
KEYCODE_MINUS | 69 |
KEYCODE_EQUALS | 70 |
KEYCODE_LEFT_BRACKET | 71 |
KEYCODE_RIGHT_BRACKET | 72 |
KEYCODE_BACKSLASH | 73 |
KEYCODE_SEMICOLON | 74 |
KEYCODE_APOSTROPHE | 75 |
KEYCODE_SLASH | 76 |
KEYCODE_AT | 77 |
KEYCODE_NUM | 78 |
KEYCODE_HEADSETHOOK | 79 |
KEYCODE_FOCUS | 80//*Camera*focus |
KEYCODE_PLUS | 81 |
KEYCODE_MENU | 82 |
KEYCODE_NOTIFICATION | 83 |
KEYCODE_SEARCH | 84 |
KEYCODE_MEDIA_PLAY_PAUSE | 85 |
KEYCODE_MEDIA_STOP | 86 |
KEYCODE_MEDIA_NEXT | 87 |
KEYCODE_MEDIA_PREVIOUS | 88 |
KEYCODE_MEDIA_REWIND | 89 |
KEYCODE_MEDIA_FAST_FORWARD | 90 |
KEYCODE_MUTE | 91 |