Android发送KEYCODE_MEDIA_PLAY_PAUSE被Google Assistant拦截问题咨询
根因说明
你当前的实现逻辑本身没有语法错误,问题出在Android系统的媒体按键路由规则:
- Android 10开始调整了媒体按键的分发优先级,当系统检测到没有处于活跃状态的媒体会话时,会默认将媒体按键事件路由给Google Assistant处理
- 运营商定制ROM额外修改了Google服务的后台唤醒优先级,长时间运行后,第三方媒体播放器的后台媒体会话优先级会被系统降低,导致按键事件被Google Assistant拦截
- 重启设备会重置所有应用的后台优先级,所以问题会临时消失,运行一段时间后优先级排序再次被调整就会复现
可行解决方案
- 方案1:申请音频焦点后再发送媒体按键
在调用dispatchMediaKeyEvent之前,先申请临时音频焦点,主动提升当前操作的路由优先级,避免事件被拦截,修改后的sendKey参考代码:
private void sendKey(int keyCode) { // 先申请音频焦点 int focusResult = mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); if (focusResult == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { KeyEvent down = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode); mAudioManager.dispatchMediaKeyEvent(down); KeyEvent up = new KeyEvent(KeyEvent.ACTION_UP, keyCode); mAudioManager.dispatchMediaKeyEvent(up); // 用完释放焦点 mAudioManager.abandonAudioFocus(null); } }
- 方案2:直接发送媒体按键广播绕过AudioManager路由
不使用AudioManager.dispatchMediaKeyEvent接口,直接发送系统媒体按键有序广播,跳过系统服务的优先级判断,代码示例:
private void sendKey(int keyCode) { Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); downIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, keyCode)); sendOrderedBroadcast(downIntent, null); Intent upIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); upIntent.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, keyCode)); sendOrderedBroadcast(upIntent, null); }
- 方案3:用户侧系统设置修复
如果不需要使用Google Assistant功能,可以进入系统设置:应用 > 默认应用 > 辅助应用和语音输入,将默认辅助应用修改为「无」,即可彻底禁止Google Assistant拦截所有媒体按键事件。
内容的提问来源于stack exchange,提问作者Kevin Krumwiede
相关产品推荐
相关产品推荐

