2017-11-14 26 views
6

Tôi đang phát triển một ứng dụng Trình phát âm thanh đơn giản cho một đài phát thanh.
Tôi đã thực hiện thành công số MediaBrowser và đã đăng ký gọi lại để nghe số playBack - hoặc metadata thay đổi.onMetadataChanged MediaControllerCompat.Callback không bao giờ được gọi là

var mediaBrowser : MediaBrowserCompat by Delegates.notNull() 
mediaBrowser = MediaBrowserCompat(
     activity, 
     ComponentName(activity, MediaPlaybackService::class.java), 
     object : MediaBrowserCompat.ConnectionCallback() { 
      override fun onConnected() { 
       val mediaController = MediaControllerCompat(activity, mediaBrowser.sessionToken) 
       MediaControllerCompat.setMediaController(activity, mediaController) 
       mediaController.registerCallback(ControllerCallback) 
       mediaControllerFunc() 
      } 
     }, 
     null 
) 

object ControllerCallback : MediaControllerCompat.Callback() { 
    override fun onMetadataChanged(metadata: MediaMetadataCompat) { 
     //TODO: Never called 
    } 

    override fun onPlaybackStateChanged(state: PlaybackStateCompat) { 
     //Called 
    } 
} 

Các playback thay đổi được nhận khi tôi gọi

mediaSession.setPlaybackState(
    PlaybackStateCompat.Builder() 
      .setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE) 
      .setState(STATE_PLAYING, DEFAULT_PLAYBACK_POSITION, DEFAULT_PLAYBACK_SPEED) 
      .build() 
) 

Tuy nhiên siêu dữ liệu thay đổi thì không.
Mặc dù tôi gọi

mediaSession.setMetadata(
    MediaMetadataCompat.Builder() 
     .putLong(METADATA_KEY_DURATION, -1) 
     .putString(METADATA_KEY_TITLE, title) 
     .putString(METADATA_KEY_ARTIST, artist) 
     .putBitmap(METADATA_KEY_ALBUM_ART, albumCover) 
     .putString(METADATA_KEY_ALBUM_ART_URI, albumCoverUrl) 
     .build() 
) 

Tôi thiếu gì để nhận thay đổi siêu dữ liệu?
Nếu nó có thể giúp kho hoàn chỉnh có sẵn trên Github

Cảm ơn trước

Trả lời

1

Giải pháp của tôi cho bất cứ ai trải qua những cùng một vấn đề.

Hóa ra tôi đã trộn compat (lớp dịch vụ chịu trách nhiệm khởi động dịch vụ âm thanh và kết nối với siêu dữ liệu) và các biến thể không compat (Lớp giao diện người dùng) của API.

Cụ thể là hoạt động.
Vì tôi đang nhắm mục tiêu đến Lollipop và cao hơn nên tôi quyết định sử dụng Activity thay vì AppCompatActivity.

Điều này dường như âm thầm ngắt MediaControllerCompat.Callback cho onMetadataChanged(), nhưng không cho onPlaybackStateChanged().
Dường như không thể tìm thấy lý do tại sao ?!

Trong mã nó cũng đơn giản như thay đổi:

class PlayableActivity : Activity() { ... }

tới:

class PlayableActivity : AppCompatActivity() { ... }

0

Có vẻ như bạn đã đăng ký gọi lại cho MediaControllerCompat, nhưng không bao giờ gọi onPlaybackStateChanged(mMediaController.getPlaybackState()) as in sample here

+0

Tôi có. Không chính xác – tim

1

onPlaybackStateChanged đúng cách làm việc cho thư viện hỗ trợ trước khi phiên bản 26 cho tôi. Kể từ đó, tôi không thể làm cho nó kích hoạt gọi lại cụ thể này cả. onMetadataChanged hoạt động bình thường sau khi cập nhật lực trên onConnected(). Mọi thứ đều thuộc loại Comppat. Tôi nhìn vào nguồn và trong trường hợp của onPlaybackStateChanged, nó dựa trên một số ExtraCallback mà không bao giờ được kích hoạt:

@Override 
     public void onPlaybackStateChanged(Object stateObj) { 
      MediaControllerCompat.Callback callback = mCallback.get(); 
      if (callback != null) { 
       if (callback.mHasExtraCallback) { 
        // Ignore. ExtraCallback will handle this. 
       } else { 
        callback.onPlaybackStateChanged(
          PlaybackStateCompat.fromPlaybackState(stateObj)); 
       } 
      } 
     } 

Tôi không chắc chắn nếu nó có liên quan, nhưng ExtraCallback này là yếu tham chiếu để nó có thể xảy ra mà nó đang bị mất và thu thập.

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