最近在高通平台上面做一款项目,有一个物理的蓝牙开关键,需添加此按键的响应。现把添加流程记录下来,以防日后遗忘。
1,硬件,驱动的中断相应。
在 kernel/include/linux/input.h 中定义KEY_BLUETOOTH
在 kernel/arch/arm/mach-msm/board-msm7627a-io.c 中和中断对应 (不是做驱动的,猜测)
[KEYMAP_INDEX(3, 4)] = KEY_BLUETOOTH, //bluetooth
2,由于event类型的名字在这个平台上是7x27a_kp, 所以在 device 里面寻找对应项目的 7x27a_kp.kl 文件。添加
# Bluetooth keys
key 237 BLUETOOTH WAKE_DROPPED
此处 237 是在驱动中定义的键值。 BLUETOOTH 是 和上层的键名对应。
3, 在 frameworks/base/include/ui/KeycodeLabels.h 中添加
{ "BLUETOOTH", 211 },
就这样,底层传过来的237键值,到了上层,就变成了 211 。
4,在 frameworks/base/core/java/android/view/KeyEvent.java 中定义
public static final int KEYCODE_BLUETOOTH = 211;
这样, 上层应用对应的键名产生了
注: 要注意 private static final int LAST_KEYCODE = KEYCODE_BLUETOOTH;
5,frameworks/base/core/res/res/values/attrs.xml 中添加
<enum name="KEYCODE_BLUETOOTH" value="211" />
6,在 frameworks/base/native/include/android/keycodes.h 添加
AKEYCODE_BLUETOOTH = 211,
7,在 frameworks/base/libs/ui/Input.cpp 中判断isSystemKey(int32_t keyCode)
case AKEYCODE_FOCUS:
case AKEYCODE_SEARCH:
+ case AKEYCODE_BLUETOOTH:
return ture;
8, ok,添加了以上的文件后,我们就应该能在应用层onkeyDown 事件中捕获到 KeyEvent.KEYCODE_BLUETOOTH 了。由于此按键在开机任何情况下都能响应bluetooth的开关,所以需在 frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 中做处理。
在 interceptKeyBeforeQueueing 函数中, 添加
case KeyEvent.KEYCODE_BLUETOOTH: {
if(down){
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter.isEnabled()) {
bluetoothAdapter.disable();
} else {
bluetoothAdapter.enable();
}
}
break;
}
搞定!