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;
}
}
}
}
更多推荐



所有评论(0)