Android控制三方音乐应用播放方案(实测可用)
应用场景:蓝牙耳机或者语音助手控制三方音频应用播放
方案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;}}}}