You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wear OS设备物理按键拦截失效问题求助

Wear OS设备物理按键拦截失效问题求助

大家好,我最近在做Wear OS设备的物理按键拦截功能时遇到了瓶颈,折腾了好几种方法都没搞定,想请教下各位大佬!

问题场景

我使用的设备是Mobvoi Ticwatch E3,目标是拦截设备的物理按键(比如电源键、侧边按键),但奇怪的是:模拟器上能正常拿到按键日志并拦截,在Ticwatch E3真机上完全没有任何按键日志输出,更别说拦截了。

已经尝试的方法

1. Accessibility Service 方案

最先尝试的是通过Accessibility服务重写onKeyEvent方法,模拟器里能正常打印按键日志,也能消费事件,但在Ticwatch E3上完全没反应,连日志都打不出来:

override fun onKeyEvent(event: KeyEvent): Boolean {
    Log.d("AccessibilityServiceKEY", "Key event: ${event.keyCode} Action: ${event.action}")
    when (event.keyCode) {
        KeyEvent.KEYCODE_POWER -> {
            if (event.action == KeyEvent.ACTION_UP) {
                Log.d("AccessibilityService", "TOP button pressed")
                return true // Consume the event
            }
        }
        KeyEvent.KEYCODE_STEM_PRIMARY -> {
            Log.d("AccessibilityService", "TOP button pressed")
            return true
        }
        KeyEvent.KEYCODE_BACK -> {
            if (event.action == KeyEvent.ACTION_UP) {
                Log.d("AccessibilityService", "BOTTOM button pressed")
                return true // Consume the event
            }
        }
    }
    return super.onKeyEvent(event)
}

2. Activity 重写按键回调

后来查了Android官方文档,试着在MainActivity里直接重写onKeyDown和onKeyUp方法,结果还是一样——真机上完全拿不到任何按键日志:

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    Log.d("KeyBTNUP", "keycode is ${keyCode} event is ${event}")
    return super.onKeyUp(keyCode, event)
}

override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
    Log.d("KeyBTNDOWN", "keycode is ${keyCode} event is ${event}")
    return if (event.repeatCount == 0) {
        when (keyCode) {
            KeyEvent.KEYCODE_STEM_1 -> {
                // Do stuff
                true
            }
            KeyEvent.KEYCODE_STEM_2 -> {
                // Do stuff
                true
            }
            KeyEvent.KEYCODE_STEM_3 -> {
                // Do stuff
                true
            }
            else -> {
                super.onKeyDown(keyCode, event)
            }
        }
    } else {
        super.onKeyDown(keyCode, event)
    }
}

3. WearableButtons 工具类排查

我还试着用WearableButtons工具类检测设备按键:

  • WearableButtons.getButtonCount(context)返回结果是2,说明设备确实有2个物理按键
  • 但调用WearableButtons.getButtonInfo(activity, KeyEvent.KEYCODE_STEM_1)和KeyEvent.KEYCODE_STEM_2时,都返回了null,这也让我摸不着头脑

我的疑问

  • 是不是我选的方案本身就不适合Ticwatch这类第三方Wear OS设备?
  • 有没有更可靠的方法能拦截Wear OS设备的物理按键?
  • 为什么WearableButtons能检测到按键数量,但拿不到具体按键的信息?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 09:19:31