PlaybackState для MediaControllerCompat - PullRequest
       82

PlaybackState для MediaControllerCompat

0 голосов
/ 01 декабря 2018

Я следовал этому руководству по созданию фонового аудиоприложения с MediaSessionCompat и столкнулся с проблемой.

В моем Activity я подключаю свой пользовательский интерфейс к медиа-контроллеру, как показано ниже

private MediaBrowserCompat.ConnectionCallback mediaBrowserConnectionCallbacks = new MediaBrowserCompat.ConnectionCallback() {
    @Override
    public void onConnected() {
        super.onConnected();
        try {
            mediaControllerCompat = new MediaControllerCompat(StreamPlayerActivity.this, mediaBrowserCompat.getSessionToken());
            mediaControllerCompat.registerCallback(mediaControllerCallbacks);
            mediaControllerCompat.setMediaController(StreamPlayerActivity.this, mediaControllerCompat);
            mediaControllerCompat.getTransportControls().playFromMediaId(String.valueOf(R.raw.hann), null);
            Log.d(TAG, "connected\t" + currentState + "\t" + mediaControllerCompat.getPlaybackState());
        } catch( RemoteException e ) {
            e.printStackTrace();
            Log.d(TAG, "connection failed");
        }
    }
};

private MediaControllerCompat.Callback mediaControllerCallbacks = new MediaControllerCompat.Callback() {
    @Override
    public void onPlaybackStateChanged(PlaybackStateCompat state) {
        super.onPlaybackStateChanged(state);
        if( state == null ) {
            return;
        }

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

В моем Service я строю свою сессию следующим образом

private MediaSessionCompat.Callback mediaSessionCallbacks = new MediaSessionCompat.Callback() {
    @Override
    public void onPlay() {
        super.onPlay();
        if( !successfullyRetrievedAudioFocus() ) {
            return;
        }

        mediaSessionCompat.setActive(true);
        setMediaPlaybackState(PlaybackStateCompat.STATE_PLAYING);

        mediaPlayer.start();
        Log.d(TAG, "mp started");
    }

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

        if( mediaPlayer.isPlaying() ) {
            mediaPlayer.pause();
            setMediaPlaybackState(PlaybackStateCompat.STATE_PAUSED);
        }
    }

    @Override
    public void onPlayFromMediaId(String mediaId, Bundle extras) {
        super.onPlayFromMediaId(mediaId, extras);

        try {
            AssetFileDescriptor afd = getResources().openRawResourceFd(Integer.valueOf(mediaId));
            if (afd == null) {
                return;
            }

            try {
                mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                Log.d(TAG, "datasource set");
            } catch (IllegalStateException e) {
                mediaPlayer.release();
                initMediaPlayer();
                mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            }

            afd.close();
            initMediaSessionMetadata();

        } catch (IOException e) {
            return;
        }

        try {
            mediaPlayer.prepare();
            Log.d(TAG, "media prepared");
        } catch (IOException e) { Log.d(TAG, "media preparation failed");
        }
    }
};

По сути, я следовал руководству сайта построчно, за исключением того, что пропустил Notification который отображает информацию о текущем аудио.При тестировании на моем устройстве я получаю ошибку NullPointerException.

Logcat обнаружил, что это происходит при попытке mediaControllerCompat.getPlaybackState().getState().Я понял, что мой MediaControllerCompat.getPlaybackState() - null.Даже Android Devleopers Site для MediaControllerCompat, похоже, не решает мою проблему здесь.Может быть, это только я, но я не вижу кода, который определяет MediaControllerCompat PlaybackState, прежде чем пытаться получить его значение.

Как мне решить эту проблему?

Спасибоаванс за помощь.

1 Ответ

0 голосов
/ 25 декабря 2018

Это была глупая ошибка.Я должен добавить setMediaPlaybackState(PlaybackStateCompat.STATE_PLAYING); после того, как мой mediaPlayer был подготовлен.

...