В моем приложении я использую 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
для моего медиа-уведомление не имеет влияния на обложке альбома отображается на экране блокировки. Это заставляет его отображаться в самом уведомлении, но не как фон блокировки экрана.
Кажется, что метод 'setVisibility' имеет отношение только к тому, какая информация отображается на защищенном заблокированном экране. Добавление этого метода в мое уведомление со СМИ не изменило поведения. –
@AndrewBrooke. Вы должны создать ** новое ** уведомление и публиковать его каждый раз, когда информация изменяется, конечно. – pantos27
Вот что я сейчас делаю. Уведомление обновляется, но изображение на экране блокировки не выполняется, кроме первого раза. –