Android: состояние воспроизведения в Media Browser Client возвращает исключение нулевого указателя

В настоящее время я разрабатываю простой медиаплеер, использующий подход клиент / сервис с использованием 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)

Я понимаю, что либо контроллер, либо состояние воспроизведения имеют значение null, поэтому очевидно, что он не может возвращать int, представляющий состояние проигрывателя.

Вот как я создаю контроллер для активности клиента в методе onConnected() из обратного вызова MediaBrowser:

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


}

Что я делаю не так. Заранее спасибо.

1 ответ

Призыв к MediaControllerCompat.getPlaybackState() может и возвращает ноль. Документация для этого метода говорит, что возвращение нулевого значения возможно. Вы должны изменить свой код, чтобы учесть такую ​​возможность.

Чтобы быть более конкретным, строка:

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

Должен быть разделен на несколько частей:

PlaybackStateCompat playbackStateCompat = mediaControllerCompat.getPlaybackState();
if (playbackStateCompat == null) {
    // handle the case that it's null
}
int estado = playbackStateCompat.getState();
Другие вопросы по тегам