2017-11-14 13 views
6

라디오 방송국을위한 간단한 오디오 플레이어 앱을 개발하고 있습니다.
성공적으로 MediaBrowser을 작성하고 playBack- 또는 metadata 변경 사항을 수신 대기하는 콜백을 등록했습니다. 내가 onMetadataChanged MediaControllerCompat.Callback을 호출하지 않았습니다.

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

그러나 변화가없는 메타 데이터 호출 할 때

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 
    } 
} 

playback 변경이 수신됩니다. 내가 메타 데이터 변경을받을 실종 무엇

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

를 호출해도
?
는 전체 저장소에 미리

답변

1

내 솔루션을 호출 할 수없는 경우 같은 문제.

compat (오디오 서비스를 시작하고 메타 데이터에 연결하는 서비스 레이어) 및 API가 아닌 compat (UI 레이어) 변형이 혼합되어 있음이 드러났습니다.

특히 활동.
저는 Lollipop 이상을 타겟팅하고 있으므로 AppCompatActivity 대신 Activity을 사용하기로 결정했습니다.

이 결과는 onMetadataChanged()에 대해 MediaControllerCompat.Callback을 자동으로 처리하지만, onPlaybackStateChanged()에 대해서는 처리하지 않습니다.
이유를 찾을 수 없습니다.

코드에서는 변화하는만큼 간단하다 :

class PlayableActivity : Activity() { ... }

에 :

class PlayableActivity : AppCompatActivity() { ... }

0

에서 Github

감사로 볼 수 있습니다 도움이 MediaControllerCompat에 대한 콜백을 등록한 것 같다,하지만 결코 사람이 경험에 대한 onPlaybackStateChanged(mMediaController.getPlaybackState()) as in sample here

+0

있습니다. 정확하지 않음 – tim

1

onPlaybackStateChanged가 제대로 나를 위해 버전 26 전에 지원 라이브러리 작동합니다. 그 이후로는이 특정 콜백을 전혀 트리거하지 못하게했습니다. onConnected()에서 강제 업데이트 후 onMetadataChanged이 올바르게 작동합니다. 모든 것은 Comppat 유형입니다.

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

나는 확실하지 않다가 관련이 있는지,하지만이 일이 발생할 수 있도록이 ExtraCallback 약하게 참조 : 나는 그것을 트리거 결코 극복하는 일부 ExtraCallback에 의존 소스로와 onPlaybackStateChanged의 경우 보였다 그것은 분실되고 모아지고 있습니다.