项目要求:该项目由于没有使用android5.0,导致启动bluetooth的蓝牙audio slave功能必须使用第三方模组,该第三方模组,启动是通过android主板通过GPIO控制。UI界面是通过图形选择或者一个kpd组合按键来打开关闭或者是启动蓝牙搜索功能。
1,用户按键的侦测:
标准的行为,用户的组合按键,kernel里面向上层发送scancode,然后framework把scancode转换成keycode的keyevent,该keyevent会被PhoneWindows接受并处理。
对于mtk,从按键到keycode,已经被封装起来,这个封装的工具就是dct.
例如,我们的项目组合按键是:KCOL2+KROW1,我们可以在图形工具中如选择我们的配置
在例子中,我们设置该案件的keycode是SYM
当然,也可以自己定义新的keycode,我嫌麻烦,,就直接使用现成的,如何定义新的按键,请看附录:
2,侦测用户按键行为,发送相应的intent
上面的keycode在发送到各个window之前,是被PhoneWindowManager.java接收到的,在其中有一个方法:
@Override
public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags, booleanisScreenOn) {
望文生义,看名字我们就知道这个函数的作用。我们在代码中如下拦截:
if (keyCode== KeyEvent.KEYCODE_SYM) {
Log.e("zcfdebug","nowwe catch the bluetooth button action !");
if (down){
Log.e("zcfdebug","nowwe catch the bluetooth button down !");
}
if (up){
Log.e("zcfdebug","nowwe catch the bluetooth button up !");
}
return 1;
}
当然,KEYCODE_SYM是原来系统中已经定义的keycode,其实就是输入法的选择,我们需要屏蔽这个功能,在alps/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java:
/**
* @hide
*/
public voiddispatchKeyEvent(Context context, int seq, KeyEvent key,
FinishedEventCallback callback) {
booleanhandled = false;
/*zcfdebug–<<
synchronized(mH) {
if(DEBUG) Log.d(TAG, "dispatchKeyEvent");
if(mCurMethod != null) {
if(key.getAction() == KeyEvent.ACTION_DOWN
&& key.getKeyCode() == KeyEvent.KEYCODE_SYM) {
showInputMethodPickerLocked();
handled = true;
}else {
try {
if (DEBUG) Log.v(TAG, "DISPATCH KEY: " + mCurMethod);
final long startTime = SystemClock.uptimeMillis();
enqueuePendingEventLocked(startTime, seq, mCurId, callback);
mCurMethod.dispatchKeyEvent(seq, key, mInputMethodCallback);
return;
} catch (RemoteException e) {
Log.w(TAG, "IME died: " + mCurId + " dropping: "+ key, e);
}
}
}
}
zcfdebug–>>*/
callback.finishedEvent(seq, handled);
}
注释掉原有功能就好了。
用最少的悔恨面对过去