2017-08-28 2 views
2

J'utilise ce example code pour créer un MediaPlayer Service. Je l'ai plus ou moins de travail, cependant si un utilisateur retourne à la Activity qui contient les contrôles de médias, je dois détecter dans quel état le MediaPlayer est po Le code que j'utilise actuellement jette une erreur NullReferenceException dans onResume parce que getPlaybackState() est toujours null.Détecter si MediaBrowserServiceCompat est en cours d'exécution

Je suis nouveau à l'aide MediaSessionCompat et selon la documentation, je peux obtenir la session en cours en quelque sorte:

« Une fois qu'une session est créée le propriétaire de la session peut passer son jeton de session à d'autres processus de leur permettre de créer un MediaControllerCompat pour interagir avec la session. "

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

Répondre

0

Je ne pouvais pas trouver un chemin à travers l'API disponible, donc je suis suivi juste que les médias est en cours de lecture par le stockage local (sqlite) et mettre à jour l'affichage par cela. Probablement pas la solution la plus élégante mais ça marche.