Что вы ищете, это больше всего по свернутой версии уведомления MediaStyle. Хотя я не уверен, как заставить его оставаться рухнувшим, это должно привести вас к правильному пути. Я использовал немного кода, найденного в UniversalMusicPlayer, который является частью примера кода для Android.
В частности - вы хотите проверить классы MediaNotificationManager и MusicService.
https://github.com/googlesamples/android-UniversalMusicPlayer/blob/master/mobile/src/main/java/com/example/android/uamp/MediaNotificationManager.java
Оба из которых являются немного слишком сложным для того, что вы пытаетесь достичь, но может быть хорошим местом, чтобы обратиться к. В частности, метод createNotification (см. Версию Play/Pause ниже).
private Notification createNotification() {
if (mMetadata == null || mPlaybackState == null) {
return null;
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mService);
int playPauseButtonPosition = 0;
addPlayPauseAction(notificationBuilder);
MediaDescriptionCompat description = mMetadata.getDescription();
String fetchArtUrl = null;
Bitmap art = null;
if (description.getIconUri() != null) {
// This sample assumes the iconUri will be a valid URL formatted String, but
// it can actually be any valid Android Uri formatted String.
// async fetch the album art icon
String artUrl = description.getIconUri().toString();
art = ChannelImageCache.getInstance().getBigImage(artUrl);
if (art == null) {
fetchArtUrl = artUrl;
// use a placeholder art while the remote art is being downloaded
art = BitmapFactory.decodeResource(mService.getResources(),
R.drawable.ic_default_art);
}
}
notificationBuilder
.setStyle(new NotificationCompat.MediaStyle()
.setShowActionsInCompactView(
new int[]{playPauseButtonPosition}) // show only play/pause in compact view
.setMediaSession(mSession.getSessionToken()))
.setColor(mNotificationColor)
.setSmallIcon(R.drawable.ic_notification)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setUsesChronometer(true)
.setContentIntent(createContentIntent(description))
.setContentTitle(description.getTitle())
.setContentText(description.getSubtitle())
.setLargeIcon(art);
setNotificationPlaybackState(notificationBuilder);
if (fetchArtUrl != null) {
fetchBitmapFromURLAsync(fetchArtUrl, notificationBuilder);
}
return notificationBuilder.build();
}
private void addPlayPauseAction(NotificationCompat.Builder builder) {
String label;
int icon;
PendingIntent intent;
if (mPlaybackState.getState() == PlaybackStateCompat.STATE_PLAYING) {
label = mService.getString(R.string.mr_media_route_controller_pause);
icon = R.drawable.uamp_ic_pause_white_24dp;
intent = mPauseIntent;
} else {
label = mService.getString(R.string.mr_media_route_controller_play);
icon = R.drawable.uamp_ic_play_arrow_white_24dp;
intent = mPlayIntent;
}
builder.addAction(new NotificationCompat.Action(icon, label, intent));
}
Это уведомление будет использовать MediaSession в службе (где я предполагаю, что ты AACDecoder/AACPlayer живет). Когда вы получите метаданные ID3 от игрока, вам нужно обновить метаданные и установить их в mediaSession.
private void updateMetadata() {
final MediaMetadataCompat track = generateMediaMetadataCompat(currentMetaData);
mediaSession.setMetadata(track);
}
private MediaMetadataCompat generateMediaMetadataCompat(SomeMetadataModelObject streamMetadata)
{
currentMediaMetadataCompat = new MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, streamMetadata.getMediaId())
.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, streamMetadata.getAlbumName())
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, streamMetadata.getArtistName())
.putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, "http://somealbumart.png")
.putString(MediaMetadataCompat.METADATA_KEY_TITLE, streamMetadata.getSongTitle())
.build();
return currentMediaMetadataCompat;
}
Я попробую. Спасибо. – Informatheus