2017-02-19 10 views
9

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.

Odpowiedz

1

Co trzeba to MediaStyle powiadomienie

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); 

Wartość VISIBILITY_PUBLIC pozwoli informacje podać tu być widoczne na ekranie blokady

Więcej informacji można znaleźć tę istotę przez @ianhanniballake https://gist.github.com/ianhanniballake/47617ec3488e0257325c

+0

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. –

+0

@AndrewBrooke Powinieneś utworzyć ** nowe ** powiadomienie i opublikować je za każdym razem, gdy informacje ulegną zmianie. – pantos27

+0

To właśnie robię obecnie. Powiadomienie zostanie zaktualizowane, ale obraz na ekranie blokady nie jest inny niż za pierwszym razem. –

Powiązane problemy