我们正在将正在进行的播放通知迁移到Lollipop中引入的MediaStyle通知. RemoteControlClient似乎已被弃用,MediaStyle通知不处理媒体按钮事件(例如通过耳机远程暂停/播放).
有没有人得到这项工作? MediaSessionCallback中没有任何事件被调用.
以下是媒体会话的初始化方式
mSession = new MediaSessionCompat(this,TAG);
mSession.setCallback(new MediaSessionCallback());
mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
mSession.setPlaybackToLocal(AudioManager.STREAM_MUSIC);
mSession.setActive(true);
以下是设置元数据的方式
MediaMetadataCompat.Builder MetadataBuilder = new MediaMetadataCompat.Builder();
MetadataBuilder
.putLong(MediaMetadata.MetaDATA_KEY_DURATION,clip.getDuration())
.putString(MediaMetadata.MetaDATA_KEY_MEDIA_ID,clip.getClipId())
.putString(MediaMetadata.MetaDATA_KEY_TITLE,clip.getTitle())
.putString(MediaMetadata.MetaDATA_KEY_ARTIST,clip.getSourceName())
.putString(MediaMetadata.MetaDATA_KEY_ALBUM_ART_URI,clip.getimageUrl())
.putLong(MediaMetadata.MetaDATA_KEY_DURATION,clip.getDuration());
mSession.setMetadata(MetadataBuilder.build());
最后,通知代码:
MediaSession mediaSession = (MediaSession) session.getMediaSession();
Notification.Builder builder =
new Notification.Builder(c)
.setDefaults(0)
.setSmallIcon(R.drawable.ic_notif)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentTitle(clip.getTitle())
.setContentText(clip.getSourceName())
.setProgress((int)duration,(int)progress,false)
.setWhen(0)
.setContentIntent(pendingIntent);
if (playing) {
builder.addAction(R.drawable.ic_media_pause,c.getString(R.string.media_pause),getPendingIntentForKeyCode(app.getApplicationContext(),KeyEvent.KEYCODE_MEDIA_PAUSE));
} else {
builder.addAction(R.drawable.ic_media_play,c.getString(R.string.media_play),KeyEvent.KEYCODE_MEDIA_PLAY));
}
builder.addAction(R.drawable.ic_media_next,c.getString(R.string.media_next),KeyEvent.KEYCODE_MEDIA_NEXT));
builder.setStyle(new Notification.MediaStyle()
.setMediaSession(mediaSession.getSessionToken())
.setShowActionsInCompactView(new int[] {1,2})
)
);
notification = builder.build();
解决方法
使用您支持的操作在MediaSession中设置播放状态:
PlaybackState state = new PlaybackState.Builder()
.setActions(
PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE |
PlaybackState.ACTION_PLAY_FROM_MEDIA_ID | PlaybackState.ACTION_PAUSE |
PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIoUS)
.setState(PlaybackState.STATE_PLAYING,position,speed,SystemClock.elapsedRealtime())
.build();
mSession.setPlaybackState(state);