2017-09-24 14 views
0

我目前正在使用Android支持庫中的MediaBrowser compat使用客戶端/服務方法開發簡單媒體播放器。Android:媒體瀏覽器客戶端上的播放狀態返回空指針異常

,我發現了以下異常:

FATAL EXCEPTION: main 
Process: valdivia.peter.inclubooks, PID: 32383 
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.support.v4.media.session.PlaybackStateCompat.getState()' on a null object reference 
at valdivia.peter.inclubooks.activities.MostrarAudiolibroActivity$3.onClick(MostrarAudiolibroActivity.java:118) 
at android.view.View.performClick(View.java:5201) 
at android.view.View$PerformClick.run(View.java:at android.os.Handler.handleCallback(Handler.java: 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5443) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

我的理解是,要麼控制器或playbackstate爲空,所以這顯然不能返回表示隊員狀態的INT。

下面是我如何創建客戶端活動控制器從MediaBrowser的回調onConnected()方法:

@Override 
     public void onConnected() { 
      super.onConnected(); 
      Log.d(tag,"Conecté al servicio"); 
      Log.d(tag,"token:" + mMediaBrowser.getSessionToken().toString()); 
      try{ 
       controller = new MediaControllerCompat(getApplicationContext(),mMediaBrowser.getSessionToken()); 
      }catch(RemoteException exception){ 
       Log.d(tag,"Remote Exception al crear el Media Controller"); 
       Toast.makeText(getApplicationContext(),"Error al crear los controles de la sesión",Toast.LENGTH_LONG).show(); 
       return; 
      } 
      controller.registerCallback(mControllerCallback); 
      MediaControllerCompat.setMediaController(MostrarAudiolibroActivity.this,controller); 
      buildTransportControls(); 
     } 

在這裏,我如何建立交通管制:

private void buildTransportControls() { 
    ImageButton mBotonPausa = (ImageButton) findViewById(R.id.mostrar_audiolibro_playpause); 
    mBotonPausa.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      MediaControllerCompat mediaControllerCompat = MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this); 
      int estado = mediaControllerCompat.getPlaybackState().getState(); 
      if(estado == PlaybackStateCompat.STATE_PLAYING){ 
       MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().pause(); 
      }else if (estado == PlaybackStateCompat.STATE_PAUSED){ 
       MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().play(); 
      }else{ 
       Bundle extras = new Bundle(); 
       extras.putString("titulo",MostrarAudiolibroActivity.this.audiolibro.getTitulo()); 
       extras.putString("autor",MostrarAudiolibroActivity.this.audiolibro.getAutor()); 
       MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().playFromUri(Uri.parse(MostrarAudiolibroActivity.this.audiolibro.getLinkAudiolibro()),extras); 
       Log.d(tag,"Voy a tratar de abrir el audio"); 
      } 
     } 
    }); 
    ImageButton mBotonReiniciar = (ImageButton) findViewById(R.id.mostrar_audiolibro_reiniciar); 
    mBotonReiniciar.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().seekTo(0); 
      //MediaControllerCompat.getMediaController(MostrarAudiolibroActivity.this).getTransportControls().play(); 
     } 
    }); 


} 

什麼我做錯了。提前致謝。

回答

0

MediaControllerCompat.getPlaybackState()的調用可以並且返回null。 documentation for that method表示返回null是一種可能性。你必須改變你的代碼以允許這種可能性。

更具體地,行:

int estado = mediaControllerCompat.getPlaybackState().getState(); 

已在多個部位進行分割:

PlaybackStateCompat playbackStateCompat = mediaControllerCompat.getPlaybackState(); 
if (playbackStateCompat == null) { 
    // handle the case that it's null 
} 
int estado = playbackStateCompat.getState(); 
相關問題