uni-app uni小程序 SDK中宿主App中MainActivity内的dispatchKeyEvent等事件无法监听

uni-app uni小程序 SDK中宿主App中MainActivity内的dispatchKeyEvent等事件无法监听

示例代码:

// ✅ 监听 FN 键(KeyCode=119)  
@Override  
public boolean dispatchKeyEvent(KeyEvent event) {  
    if (event.getKeyCode() == 119) { // FN 键  
        if (event.getAction() == KeyEvent.ACTION_UP) {  
            Log.d("KeyEvent", "FN键松开,尝试发送事件");  
            if (runningMP != null) {  
                try {  
                    JSONObject obj = new JSONObject();  
                    obj.put("keyCode", 119);  
                    boolean success = runningMP.sendUniMPEvent("onFnButtonDown", obj);  
                    Log.d("KeyEvent", "事件发送结果: " + success);  
                    return true; // 拦截 FN 键  
                } catch (JSONException e) {  
                    Log.e("KeyEvent", "JSON 异常", e);  
                }  
            }  
        }  
        return true; // 拦截 FN 键的所有事件(DOWN 和 UP)  
    }  
    return super.dispatchKeyEvent(event);  
}

操作步骤:

运行uni小程序 SDK demo,监听dispatchKeyEvent,发现未打开小程序之前点击安卓系统返回按钮dispatchKeyEvent可以正常触发,在打开小程序后dispatchKeyEvent不再触发。

预期结果:

dispatchKeyEvent在任何情况下都可以正常触发,或者有无在打开小程序下监听系统按键的方案?我们设备是PDA,需要监听系统按键的点击。

实际结果:

在打开小程序后无法监听dispatchKeyEvent事件

bug描述:

uni小程序 SDK中,在打开小程序之后,宿主App中MainActivity内的dispatchKeyEvent等事件无法监听。如果未打开小程序,可以正常监听。因为打开小程序打开了新的进程,旧的宿主应用无法监听相关事件。


更多关于uni-app uni小程序 SDK中宿主App中MainActivity内的dispatchKeyEvent等事件无法监听的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

麻烦看一下~

更多关于uni-app uni小程序 SDK中宿主App中MainActivity内的dispatchKeyEvent等事件无法监听的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在宿主App中监听按键事件,在打开小程序后失效是预期行为。因为小程序运行在独立进程中,宿主Activity的dispatchKeyEvent自然无法接收到小程序窗口的按键事件。

解决方案:

  1. 使用小程序页面的按键监听 在uni-app小程序的页面中监听按键事件:
// 在小程序页面的 onLoad 或 onReady 中
document.addEventListener('keydown', (event) => {
    if (event.keyCode === 119) { // FN键
        // 处理按键逻辑
        uni.$emit('fnKeyDown', { keyCode: 119 });
    }
});
  1. 通过原生插件扩展 如果需要在多个小程序中复用此功能,建议开发原生插件:
// 创建 UniApp 原生模块
public class KeyEventModule extends UniModule {
    @UniJSMethod
    public void registerKeyListener() {
        // 注册全局按键监听
    }
}
回到顶部