检测 Samsung Galaxy Watch 4(Android Wear 操作系统)上的长按键

Rat*_*ing 5 android keyboard-events wear-os

我为运行 Wear OS 的手表编写了一个航海应用程序。航海手表经常被弄湿,因此我禁用了屏幕并使用物理按键(按一次和多次)来导航菜单。到目前为止,一切都很好

我现在正在尝试检测长按物理键(用于紧急人员落水功能),但到目前为止,我无法找到在 Samsung Galaxy Watch 上按住物理键时触发的任何事件4.

谁能建议如何检测 Samsung Galaxy Watch 4 上的长按键操作?

大多数按键检测可以通过重写 onKeyDown() 来完成

    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        return if (keyCode == bottomKeyCode) {
            // process bottomKeyPress
            writeToLog("onKeyDown()")
            event.startTracking() // required to enable LongPress (works on TicWatch NOT Samsung)
            true
        } else
            super.onKeyDown(keyCode, event)
    }

Run Code Online (Sandbox Code Playgroud)

在 Samsung Galaxy Watch 4 上,短按将触发 onKeyDown() 事件

问题是按住该键时不会触发任何事件。按住该键不会触发onKeyDownonKeyLongPressonKeyUp当松开按键时它甚至不会触发!

进一步测试

我也看过dispatchKeyEvent()

    override fun dispatchKeyEvent(event: KeyEvent): Boolean {
        writeToLog("dispatchKeyEvent() keyCode ${event.keyCode} keyAction ${event.action}")
        return super.dispatchKeyEvent(event)
    }
Run Code Online (Sandbox Code Playgroud)

这也没有成功

我已经在 Ticwatch Pro 3 GPS(Wear OS 2)上运行了代码,其行为“更接近”Android 文档中描述的内容。当第一次按下按键时,会触发 onKeyDown()。继续按住该键将导致 350 毫秒后发生第二次 onKeyDown()。接下来是每 50 毫秒发送一次更多的 onKeyDown() 事件(以及 onLongKeyPress())。因此,在 TicWatch 上实现长按键检测最简单的方法就是简单地统计 onKeyDown() 事件的数量(为了避免不需要的 onLongKeyPress() 事件,只需删除 event.startTracking() 即可)。

请注意,Samsung Galaxy Watch 4 使用keyCode == KeyEvent.KEYCODE_BACK底部物理按键,而不是 Ticwatch 使用 KeyEvent.KEYCODE_STEM_1。为了完整起见,我调查了onBackPressed()但这也没有被触发

    override fun onBackPressed() {
        writeToLog("onBackPressed()")
        super.onBackPressed()
    }
Run Code Online (Sandbox Code Playgroud)

Rat*_*ing 4

三星终于回应,正式答复是不支持长按

不幸的是,无法从 Samsung Galaxy Watch 4 调度长按 keyEvent。

手表 4 的两个硬件按钮(名为 Home 键和 Back 键)都是系统键。

根据三星的政策,在系统按键的情况下,第3方无法获取watch 4设备的KeyEvent。

事实上,第三方应用程序可以访问 onKeyDown() 事件(如原始问题所示),只要短按一下即可

如果按住后退键,则手表不会触发 onKeyDown() 事件(意味着任何使用计时器模拟 onLongKeyPress() 事件的尝试也将失败)