mtk硬件启动关闭蓝牙功能的项目:mtk 硬件ScanCode和keycode应用

项目要求:该项目由于没有使用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);

}

注释掉原有功能就好了。

用最少的悔恨面对过去

mtk硬件启动关闭蓝牙功能的项目:mtk 硬件ScanCode和keycode应用

相关文章:

你感兴趣的文章:

标签云: