W mojej aplikacji korzystam z MediaSessionCompat
do obsługi odtwarzania dźwięku z mojej usługi odtwarzacza multimedialnego. W szczególności chcę nadać metadane bieżącego utworu urządzeniom bluetooth (które działa) i ustawić obraz ekranu blokady na grafikę albumu obecnej piosenki.MediaMetadataCompat METADATA_KEY_ART ustawia tylko obraz po raz pierwszy
podobne do tego pytania: Set lock screen background in Android (like Spotify do)
każdej zmianie utworu, najpierw jasne off obecnego MediaMetadataCompat
i PlaybackStateCompat
z MediaSessionCompat
tak:
mSession.setActive(false);
mSession.setMetadata(null);
mSession.setPlaybackState(null);
Potem tworzyć nowe instancje tych klasy z ich odpowiednimi budowniczymi
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();
Następnie ustawiam nowe metadane na MediaSessionCompat
mSession.setActive(true);
mSession.setMetadata(metadata);
mSession.setPlaybackState(state);
Na moim urządzeniu Bluetooth, Metadane działa dobrze, i zmienia się przy każdym zmiany utworu. Jednak na moim telefonie aktualizacja okładki albumu ekranowego pojawia się za pierwszym razem. Potwierdziłem, że ustawiona bitmapa jest nowa, ale obraz się nie zmienia.
Tworzę również powiadomienie o stylu mediów w usłudze, aby umożliwić użytkownikowi sterowanie muzyką z trwałego powiadomienia i z ekranu blokady.
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());
Jednak metoda setLargeIcon
dla mojego zawiadomienia mediów nie ma wpływu na okładce albumu są wyświetlane na ekranie blokady. Powoduje to, że pojawia się w samym powiadomieniu, ale nie jako tło ekranu blokady.
Wygląda na to, że metoda 'setVisibility' ma jedynie związek z informacjami wyświetlanymi na bezpiecznym ekranie blokady. Dodanie tej metody do powiadomienia o multimediach nie zmieniło zachowania. –
@AndrewBrooke Powinieneś utworzyć ** nowe ** powiadomienie i opublikować je za każdym razem, gdy informacje ulegną zmianie. – pantos27
To właśnie robię obecnie. Powiadomienie zostanie zaktualizowane, ale obraz na ekranie blokady nie jest inny niż za pierwszym razem. –