2017-02-19 21 views
9

Trong ứng dụng của tôi, tôi đang sử dụng MediaSessionCompat để xử lý phát âm thanh từ dịch vụ trình phát đa phương tiện của mình. Đặc biệt, tôi muốn phát sóng siêu dữ liệu của bài hát hiện tại tới các thiết bị bluetooth (hoạt động) và đặt hình ảnh màn hình khóa thành ảnh bìa album của bài hát hiện tại.MediaMetadataCompat METADATA_KEY_ART chỉ đặt hình ảnh lần đầu tiên

Tương tự như câu hỏi này: Set lock screen background in Android (like Spotify do)

Mỗi lần thay đổi bài hát, đầu tiên tôi rõ ràng ra khỏi hiện MediaMetadataCompatPlaybackStateCompat từ MediaSessionCompat như vậy:

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

Sau đó, tôi tạo ra các trường hợp mới của những các lớp học với các nhà xây dựng tương ứng

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

Sau đó, tôi đặt siêu dữ liệu mới các MediaSessionCompat

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

Trên thiết bị bluetooth của tôi, Siêu dữ liệu hoạt động tốt và thay đổi mỗi khi bài hát thay đổi. Tuy nhiên, trên điện thoại của tôi, bìa album màn hình khóa chỉ cập nhật lần đầu tiên. Tôi đã xác nhận rằng bitmap tôi đang thiết lập là hình ảnh mới nhưng hình ảnh không thay đổi.

Tôi cũng đang tạo thông báo kiểu phương tiện trong dịch vụ để cho phép người dùng kiểm soát nhạc từ thông báo liên tục và từ màn hình khóa của họ.

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

Tuy nhiên, phương pháp setLargeIcon cho thông báo phương tiện của tôi không ảnh hưởng đến bìa album được hiển thị trên màn hình khóa. Điều này làm cho nó hiển thị trong chính thông báo, nhưng không hiển thị trên nền màn hình khóa.

Trả lời

1

Những gì bạn cần là một thông báo 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); 

Giá trị VISIBILITY_PUBLIC sẽ cho phép các thông tin mà bạn đặt ở đây được hiển thị trên màn hình khóa của bạn

Để biết thêm thông thấy ý chính này bằng cách @ianhanniballake https://gist.github.com/ianhanniballake/47617ec3488e0257325c

+0

Dường như phương thức 'setVisibility' chỉ liên quan đến thông tin xuất hiện trên màn hình khóa an toàn. Thêm phương thức này vào thông báo Phương tiện của tôi đã không thay đổi hành vi –

+0

@AndrewBrooke Bạn nên tạo thông báo ** mới ** và đăng thông báo đó mỗi khi thông tin thay đổi, tất nhiên. – pantos27

+0

Đó là những gì tôi hiện đang làm. Thông báo được cập nhật nhưng hình ảnh trên màn hình khóa không phải là lần đầu tiên. –

Các vấn đề liên quan