2017-08-28 3 views
2

私はこのexample codeを使用してMediaPlayer Serviceを構築しています。私は多かれ少なかれ動作しますが、ユーザがメディアコントロールを含むActivityに戻ると、MediaPlayerの状態を検出する必要があります。NullReferenceExceptionのエラーがNullReferenceExceptionにあります。getPlaybackState()は常にnullMediaBrowserServiceCompatが実行されているかどうかを検出します。

私はMediaSessionCompatを使用する新たなんだとマニュアルによると、私は何とか現在のセッションを取得することができます:

「セッションが作成されると、セッションの所有者がに他のプロセスにそのセッショントークンを渡すことができますそれらがセッションと対話するMediaControllerCompatを作成することを許可します。

public class MediaActivity extends AppCompatActivity { 

    private MediaBrowserCompat mMediaBrowserCompat; 
    private MediaControllerCompat mMediaControllerCompat; 
    private Activity mActivity; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     setContentView(R.layout.activity_media); 

     mActivity = this; 
     mPlayButton = (Button)findViewById(R.id.btn_play); 

     mMediaBrowserCompat = new MediaBrowserCompat(
       getApplicationContext(), 
       new ComponentName(mContext, MediaPlayerService.class), 
       mMediaBrowserCompatConnectionCallback, 
       getIntent().getExtras() 
     ); 

     mMediaBrowserCompat.connect();  

     mPlayButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if(mCurrentState == STATE_PAUSED) { 
         getSupportMediaController().getTransportControls().play(); 
         mCurrentState = STATE_PLAYING; 
         mPlayButton.setText("Pause"); 
       } else { 
        MediaControllerCompat.getMediaController(mActivity).getTransportControls().pause(); 
        mCurrentState = STATE_PAUSED; 
        mPlayButton.setText("Play"); 
       } 
      } 
     }); 

     @Override 
     public void onResume() { 
      super.onResume(); 

      if (MediaControllerCompat.getMediaController(mActivity).getPlaybackState().getState() == PlaybackStateCompat.STATE_PLAYING) { 
       mPlayButton.setText("Pause") 
      } 
      else{ 
       mPlayButton.setText("Play")  
      } 

     }  

     private MediaBrowserCompat.ConnectionCallback mMediaBrowserCompatConnectionCallback = new MediaBrowserCompat.ConnectionCallback() { 

      @Override 
      public void onConnected() { 
       super.onConnected(); 
       try { 
        mMediaControllerCompat = new MediaControllerCompat(PodcastEpisodeActivity.this, mMediaBrowserCompat.getSessionToken()); 
        mMediaControllerCompat.registerCallback(mMediaControllerCompatCallback); 
        MediaControllerCompat.setMediaController(mActivity, mMediaControllerCompat); 
        MediaControllerCompat.getMediaController(mActivity).getTransportControls().playFromUri(Uri.parse("http://www.url.com"), extras); 

       } catch(RemoteException e) { 
        Log.e(mActivity.getPackageName(), e.toString()); 
       } 
      } 
     }; 


     private MediaControllerCompat.Callback mMediaControllerCompatCallback = new MediaControllerCompat.Callback() { 

      @Override 
      public void onPlaybackStateChanged(PlaybackStateCompat state) { 
       super.onPlaybackStateChanged(state); 

       if (state == null) return; 

       switch (state.getState()) { 
        case PlaybackStateCompat.STATE_PLAYING: { 
         mCurrentState = STATE_PLAYING; 
         break; 
        } 
        case PlaybackStateCompat.STATE_PAUSED: { 
         mCurrentState = STATE_PAUSED; 
         break; 
        } 
       } 
      } 
     }; 
    } 
} 

答えて

0

私は、利用可能なAPIを介しての方法を見つけ出すことができなかったので、私はちょうどメディアは、ローカルストレージ(sqliteの)で再生されている追跡し、そのを通じて表示を更新しています。おそらくもっとも洗練されたソリューションではないでしょうが、それは機能します。

関連する問題