应用场景:蓝牙耳机或者语音助手控制三方音频应用播放

方案1:模拟物理按键

最推荐的方式,因为它能确保按键事件只发送给当前正在播放的应用,也不需要特殊权限

// 初始化 AudioManager
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

private void dispatchKeyEvent(int keyCode) {
    long eventTime = SystemClock.uptimeMillis();
    // 创建一个按下事件
    KeyEvent downEvent = new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, keyCode, 0);
    mAudioManager.dispatchMediaKeyEvent(downEvent);
    // 创建一个抬起事件
    KeyEvent upEvent = new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_UP, keyCode, 0);
    mAudioManager.dispatchMediaKeyEvent(upEvent);
}

// 使用方法:播放/暂停
dispatchKeyEvent(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE);
// 下一首
dispatchKeyEvent(KeyEvent.KEYCODE_MEDIA_NEXT);
// 上一首
dispatchKeyEvent(KeyEvent.KEYCODE_MEDIA_PREVIOUS);

方案二:MediaController方案

这个方案有个限制,需要MEDIA_CONTENT_CONTROL(android.permission.MEDIA_CONTENT_CONTROL权限,适合系统应用。此外,MediaController支持播放状态查询,快进快退等功能,可以借此研发更多功能。

private void executeMediaCommand(String cmd) {
        MediaSessionManager manager =
                (MediaSessionManager) YourApplication.getContext().getSystemService(Context.MEDIA_SESSION_SERVICE);
        List<MediaController> controllers = manager.getActiveSessions(null);
        LogUtil.i(TAG, "get active controllers, size:" + controllers.size());
        if (!Objects.isNull(controllers) && !controllers.isEmpty()) {
            switch(cmd) {
                case MEDIA_OPT_NEXT: {
                    controllers.get(0).getTransportControls().skipToNext();
                    break;
                }
                case MEDIA_OPT_PREVIOUS: {
                    controllers.get(0).getTransportControls().skipToPrevious();
                    break;
                }
                case MEDIA_OPT_PLAY: {
                    controllers.get(0).getTransportControls().play();
                    break;
                }
                case MEDIA_OPT_PAUSE: {
                    controllers.get(0).getTransportControls().pause();
                    break;
                }
                default: {
                    LogUtil.i(TAG, "unknown cmd.");
                    break;
                }
            }
        }
 }

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐