关键字

新按键, 订阅失败, down、up事件、同时订阅、OpenHarmony 5.1.0 release、inputConsumer

问题描述

  1. 连接蓝牙遥控器,systemui应用中同时订阅蓝牙遥控器某按键down,up事件,代码如下
  2. 通过多模模块打印可以看出多模收到了键值,如keyCode: 2101 (后续以2101为例说明,对应按键KEYCODE_F12)
  3. 而应用端down, up事件都未收到
// 定义按键选项(DOWN事件)
const keyOptionsDown: inputConsumer.KeyOptions = {
  preKeys: [], // 前置键(组合键时使用)
  finalKey: KeyCode.KEYCODE_F12, // 目标键值
  isFinalKeyDown: true, // 按下事件 down
  finalKeyDownDuration: 100 // 长按持续时间(毫秒)
};

// 定义按键选项(UP事件)
const keyOptionsUp: inputConsumer.KeyOptions = {
  ...keyOptionsDown,
  isFinalKeyDown: false // 改为释放事件 up
  finalKeyDownDuration: 200
};

// 统一事件回调处理
const callback = (event: inputConsumer.KeyOptions) => {
  if (event.isFinalKeyDown) {
    console.log(`按键按下: ${event.finalKey}`);
  } else {
    console.log(`按键释放: ${event.finalKey}`);
  }
};

// 订阅事件
inputConsumer.on("key", keyOptionsDown, callback);
inputConsumer.on("key", keyOptionsUp, callback);

解决方法

  1. 修改配置文件foundation/multimodalinput/input/etc/exceptional_system_keys_config.json,添加如下代码
... ...
        {
            "preKeys": [],
            "finalKey": 2101,
            "longPressTime": 200,
            "triggerType": "up"
        },
        {
            "preKeys": [],
            "finalKey": 2101,
            "longPressTime": 100,
            "triggerType": "down"
        },
... ...
  1. 验证结果:能收到down事件,但收不到up事件(按键释放事件)
  2. 修改多模代码,如下:
diff --git a/frameworks/napi/input_consumer/src/js_register_module.cpp b/frameworks/napi/input_consumer/src/js_register_module.cpp

     auto downTime = keyItem->GetDownTime();
     auto upTime = keyEvent->GetActionTime();
     auto curDurationTime = keyOption->GetFinalKeyDownDuration();
-    if (curDurationTime > 0 && (upTime - downTime >= (static_cast<int64_t>(curDurationTime) * 1000))) {
+    if (curDurationTime > 0 && (upTime - downTime >= (static_cast<int64_t>(curDurationTime) * 1000)) &&
+        !(infoFinalKey == KeyEvent::KEYCODE_F12 && isFinalKeydown == false)) {
         MMI_HILOGE("Skip, upTime - downTime >= duration");
         return false;
     }



diff --git a/service/subscriber/src/key_shortcut_manager.cpp b/service/subscriber/src/key_shortcut_manager.cpp

static const std::vector<int32_t> specialKeyCodes = {
     KeyEvent::KEYCODE_HEADSETHOOK,
     KeyEvent::KEYCODE_HOME,
     KeyEvent::KEYCODE_MENU,
-    KeyEvent::KEYCODE_VOICE_ASSISTANT
+    KeyEvent::KEYCODE_VOICE_ASSISTANT,
+    KeyEvent::KEYCODE_F12
 };
 
void KeyShortcutManager::MarkShortcutConsumed(const KeyOption &shortcut)
         [this](auto keyCode) {
             shortcutConsumed_.emplace(keyCode);
         });
-    if (shortcut.IsFinalKeyDown()) {
+    if (shortcut.IsFinalKeyDown() || (!shortcut.IsFinalKeyDown() && shortcut.GetFinalKey() == KeyEvent::KEYCODE_F12)) {
         shortcutConsumed_.emplace(shortcut.GetFinalKey());
     }
     shortcutConsumed_.erase(KeyEvent::KEYCODE_VOLUME_UP);



diff --git a/service/subscriber/src/key_subscriber_handler.cpp b/service/subscriber/src/key_subscriber_handler.cpp

         std::optional<KeyEvent::KeyItem> keyItem = keyEvent->GetKeyItem();
         CHK_KEY_ITEM(keyItem);
-        if (keyEvent->GetActionTime() - keyItem->GetDownTime() >= MS2US(duration)) {
+        if (keyEvent->GetActionTime() - keyItem->GetDownTime() >= MS2US(duration) &&
+            keyCode != KeyEvent::KEYCODE_F12) {
             MMI_HILOGE("upTime - downTime >= duration");
             continue;
         }
  1. 编译验证,在应用端down, up事件都能收到
  • 备注:此方法不通用,如果是订阅其他按键需要改对应按键或改为比较通用的方法
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐