2017-02-19 6 views
9

В моем приложении я использую MediaSessionCompat для обработки воспроизведения звука с моего сервиса медиаплеера. В частности, я хочу транслировать метаданные текущей песни на устройства bluetooth (которая работает) и установить изображение экрана блокировки в обложку альбома текущей песни.MediaMetadataCompat METADATA_KEY_ART только устанавливает изображение в первый раз

Похожие на этот вопрос: Set lock screen background in Android (like Spotify do)

Каждый раз, когда меняется песня, я первый ясный от текущего MediaMetadataCompat и PlaybackStateCompat от MediaSessionCompat так:

mSession.setActive(false); 
mSession.setMetadata(null); 
mSession.setPlaybackState(null); 

Затем я создаю новые экземпляры тех классы с их соответствующими строителями

MediaMetadataCompat metadata = new MediaMetadataCompat.Builder() 
     .putString(MediaMetadataCompat.METADATA_KEY_TITLE, 
           songName) 
     .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, 
           artistName) 
     .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, 
           albumName) 
     .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, durationMs) 
     .putBitmap(MediaMetadataCompat.METADATA_KEY_ART, bitmap) 
     .build(); 

PlaybackStateCompat state = new PlaybackStateCompat.Builder() 
     .setActions(PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_PAUSE | 
            PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) 
     .setState(PlaybackStateCompat.STATE_PLAYING, positionMs, 1.0f, SystemClock.elapsedRealtime()) 
     .build(); 

Затем я установил новые метаданные на MediaSessionCompat

mSession.setActive(true); 
mSession.setMetadata(metadata); 
mSession.setPlaybackState(state); 

На моем Bluetooth-устройства, метаданные прекрасно работает, и изменения каждый раз при смене песни. Однако на моем телефоне обложка альбома блокировки экрана обновляется только в первый раз. Я подтвердил, что битмап, который я устанавливаю, является новым, но изображение не изменяется.

Я также создаю уведомление в стиле мультимедиа в службе, чтобы позволить пользователю управлять музыкой из постоянного уведомления и с экрана блокировки.

NotificationCompat.MediaStyle style = new NotificationCompat.MediaStyle(); 
style.setShowActionsInCompactView(0, 1, 2, 3, 4); 

Intent intent = new Intent(this, DestinationActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); 
NotificationCompat.Builder builder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.ic_notification) 
      .setContentIntent(pendingIntent) 
      .setStyle(style) 
      .setContentTitle(songName) 
      .setContentText(artistName) 
      .setLargeIcon(bitmap); 

// Code to set notification actions 

startForeground(NOTIFICATION_ID_PLAYER_CONTROLS, builder.build()); 

Однако метод setLargeIcon для моего медиа-уведомление не имеет влияния на обложке альбома отображается на экране блокировки. Это заставляет его отображаться в самом уведомлении, но не как фон блокировки экрана.

ответ

1

Что вам нужно, это MediaStyle уведомление

MediaControllerCompat controller = mediaSession.getController(); 
MediaMetadataCompat mediaMetadata = controller.getMetadata(); 
MediaDescriptionCompat description = mediaMetadata.getDescription(); 

NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 

builder.setContentTitle(description.getTitle()) 
    .setContentText(description.getSubtitle()) 
    .setSubText(description.getDescription()) 
    .setLargeIcon(description.getIconBitmap()) 
    .setContentIntent(controller.getSessionActivity()) 
    .setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(context,PlaybackStateCompat.ACTION_STOP)) 
        .setVisibility(NotificationCompat.VISIBILITY_PUBLIC); 

Значение VISIBILITY_PUBLIC позволит Введенная информация здесь видны на экране блокировки

Для получения дополнительной информации см это суть по @ianhanniballake https://gist.github.com/ianhanniballake/47617ec3488e0257325c

+0

Кажется, что метод 'setVisibility' имеет отношение только к тому, какая информация отображается на защищенном заблокированном экране. Добавление этого метода в мое уведомление со СМИ не изменило поведения. –

+0

@AndrewBrooke. Вы должны создать ** новое ** уведомление и публиковать его каждый раз, когда информация изменяется, конечно. – pantos27

+0

Вот что я сейчас делаю. Уведомление обновляется, но изображение на экране блокировки не выполняется, кроме первого раза. –