按键事件订阅失败问题(oh5.1.0 release)
·
关键字
新按键, 订阅失败, down、up事件、同时订阅、OpenHarmony 5.1.0 release、inputConsumer
问题描述
- 连接蓝牙遥控器,systemui应用中同时订阅蓝牙遥控器某按键down,up事件,代码如下
- 通过多模模块打印可以看出多模收到了键值,如keyCode: 2101 (后续以2101为例说明,对应按键KEYCODE_F12)
- 而应用端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);
解决方法
- 修改配置文件foundation/multimodalinput/input/etc/exceptional_system_keys_config.json,添加如下代码
... ...
{
"preKeys": [],
"finalKey": 2101,
"longPressTime": 200,
"triggerType": "up"
},
{
"preKeys": [],
"finalKey": 2101,
"longPressTime": 100,
"triggerType": "down"
},
... ...
- 验证结果:能收到down事件,但收不到up事件(按键释放事件)
- 修改多模代码,如下:
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;
}
- 编译验证,在应用端down, up事件都能收到
- 备注:此方法不通用,如果是订阅其他按键需要改对应按键或改为比较通用的方法
更多推荐

所有评论(0)