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
相关产品推荐
相关产品推荐

