2017-08-28 5 views
2

Ich verwende diese example code, um eine MediaPlayer Service zu erstellen. Ich habe es mehr oder weniger funktioniert, aber wenn ein Benutzer zum Activity zurückkehrt, der die Mediensteuerelemente enthält, muss ich erkennen, in welchem ​​Status MediaPlayer ist. Der Code, den ich momentan verwende, sendet einen NullReferenceException Fehler in onResume, weil getPlaybackState() immer ist null.Ermitteln, ob MediaBrowserServiceCompat ausgeführt wird

Ich bin neu zur Verwendung von MediaSessionCompat und entsprechend der Dokumentation, kann ich die aktuelle Sitzung erhalten irgendwie:

„Sobald eine Session ist der Besitzer der Sitzung erstellt kann seine Session-Token an andere Prozesse übergeben erlauben Sie ihnen, eine MediaControllerCompat zu erstellen, um mit der Sitzung zu interagieren. "

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

Antwort

0

Ich kann nicht einen Weg durch die verfügbare API herausfinden, so bin ich nur Tracking, welche Medien durch lokale Speicherung (SQLite) wiedergegeben wird und die Anzeige durch die Aktualisierung. Wahrscheinlich nicht die eleganteste Lösung, aber es funktioniert.

Verwandte Themen