android 把底层传上来的按键值在传给应用时改为其他的键值

有些按键值上层有定义,但是底层并没有定义,驱动反馈定义以后会有问题,这时候为了方便,底层定义现有的按键,然后需要在framework层把按键值转换一下。

起初认为这个应该是在phonewindowmanager.java里去处理,因为通常framework里的按键特殊处理都是在这进行的,心想在这键值替换应该就可以了,通过一顿骚操作,log查看,结果并不任意,log显示phonewindowmanager.java里已经替换成功,可以应用中的键值还是原来的那个自我。好吧,只好继续往前查找,以前一直认为phonewindowmanager中interceptKeyBeforeQueueing数是在phonewindowmanager 中调用的,通过log 发现,其实并不是之前认为的那样,而是在 InputDispatcher.cpp 中调用过来的,于是就可以在这里看看有没有键值可以转换的地方,InputDispatcher.cpp的代码查看和log分析,InputDispatcher::dispatchOnceInnerLocked 这个函数里处理了一些设备的输入信息,
case EventEntry::TYPE_KEY: 这个下面处理的就是按键信息,于是在这加上我们的按键转代码,大功告成

    case EventEntry::TYPE_KEY: {
        KeyEntry* typedEntry = static_cast<KeyEntry*>(mPendingEvent);

//songjian add
#if defined(ET660_MMI)
        int keyCode=typedEntry->keyCode;
                switch(keyCode)
                {
                    case 133://f3
                        keyCode=17;//KeyEvent.KEYCODE_STAR;    
                        break;
                    case 134:
                        keyCode=18;//KeyEvent.KEYCODE_POUND;
                        break;
                    case 135:
                        
                        break;
                    case 136:
                        keyCode=5;//KeyEvent.KEYCODE_CALL;
                        break;
                    case 137://f7
                        keyCode=6;//KeyEvent.KEYCODE_ENDCALL;
                        break;
                }
                typedEntry->keyCode=keyCode;
#endif
//end
        if (isAppSwitchDue) {
            if (isAppSwitchKeyEventLocked(typedEntry)) {
                resetPendingAppSwitchLocked(true);
                isAppSwitchDue = false;
            } else if (dropReason == DROP_REASON_NOT_DROPPED) {
                dropReason = DROP_REASON_APP_SWITCH;
            }
        }
        if (dropReason == DROP_REASON_NOT_DROPPED
                && isStaleEventLocked(currentTime, typedEntry)) {
            dropReason = DROP_REASON_STALE;
        }
        if (dropReason == DROP_REASON_NOT_DROPPED && mNextUnblockedEvent) {
            dropReason = DROP_REASON_BLOCKED;
        }
        done = dispatchKeyLocked(currentTime, typedEntry, &dropReason, nextWakeupTime);
        break;
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Android TV 上获取蓝牙键值并将其传递给内核,您需要执行以下步骤: 1. 在 Android TV 上设置蓝牙配对设备。 2. 创建一个 BroadcastReceiver 以接收蓝牙键值。 3. 在 BroadcastReceiver 中处理蓝牙键值,并将其传递给内核。 以下是一个示例 BroadcastReceiver: ```java public class BluetoothReceiver extends BroadcastReceiver { private static final String TAG = "BluetoothReceiver"; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); switch (state) { case BluetoothAdapter.STATE_OFF: Log.d(TAG, "Bluetooth off"); break; case BluetoothAdapter.STATE_TURNING_OFF: Log.d(TAG, "Turning Bluetooth off..."); break; case BluetoothAdapter.STATE_ON: Log.d(TAG, "Bluetooth on"); break; case BluetoothAdapter.STATE_TURNING_ON: Log.d(TAG, "Turning Bluetooth on..."); break; } } else if (BluetoothDevice.ACTION_KEY_EVENT.equals(action)) { int keyCode = intent.getIntExtra(BluetoothDevice.EXTRA_KEY_CODE, -1); if (keyCode != -1) { // Do something with the key code, such as pass it to the kernel } } } } ``` 您需要将此 BroadcastReceiver 注册到您的 Android TV 应用程序中,并使用 IntentFilter 指定要接收的蓝牙广播。例如,您可以在 onCreate() 方法中注册 BroadcastReceiver: ```java IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(BluetoothDevice.ACTION_KEY_EVENT); registerReceiver(new BluetoothReceiver(), filter); ``` 在 BroadcastReceiver 中,您可以处理蓝牙键值并将其传递给内核。为了将键值传递给内核,您需要使用 JNI 调用 C 函数,并将键值作为参数传递。例如: ```java public class MyNativeLibrary { static { System.loadLibrary("my_native_library"); } public static native void sendKeyEvent(int keyCode); } ``` 您需要在您的 C 代码中实现 sendKeyEvent() 函数,以便它能够将键值传递给内核。例如: ```c JNIEXPORT void JNICALL Java_com_example_MyNativeLibrary_sendKeyEvent(JNIEnv *env, jobject obj, jint keyCode) { // Send key event to kernel } ``` 这是一个简单的示例,您需要根据您的特定用例进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值