Получить элемент воспроизведения из MediaBrowserService - PullRequest
1 голос
/ 06 января 2020

У меня есть аудиоприложение с домом Activity, содержащее список предметов. Пользователь выбирает элемент, и я передаю идентификатор другому Activity, который имеет элементы управления (воспроизведение / пауза / громкость и т. Д. c). Воспроизведение аудио передается в MediaBrowserService. Мне нужно определить, воспроизводится ли в данный момент элемент, который выбирает пользователь, но я не могу понять, как не сохранять идентификатор в локальном хранилище (SharedPrefs или SQlite).

Я передаю идентификатор предмета со второго Activity на MediaBrowserService, хотя Bundle. Я думал, что смогу затем получить идентификатор во втором Activity, используя getExtras(), но он всегда возвращает 0 или ноль, в зависимости от того, какой код я использую (см. Ниже).

Я не против использования локальное хранилище, но кажется, что должен быть лучший способ. Это то, что я до сих пор:

public class EpisodeActivity extends Activity {
    private MediaBrowserCompat mMediaBrowserCompat;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final Bundle extras = new Bundle();
        extras.putInt("episodeid", getIntent().getExtras().getInt("episodeid")); //passed in from Home Activity

        mMediaBrowserCompat = new MediaBrowserCompat(
                this,
                new ComponentName(this, MediaPlayerService.class),
                mMediaBrowserCompatConnectionCallback,
                extras
        );

        mPlayButton.setOnClickListener(view -> {

            final Bundle extras = new Bundle();
            extras.putInt("episodeid", getIntent().getExtras().getInt("episodeid")); //passed in from Home Activity

            String url = "http://www.example.com/media.mp3"

            MediaControllerCompat.getMediaController(mActivity).getTransportControls().playFromUri(Uri.parse(uri), extras);
        });


        if (MediaControllerCompat.getMediaController(mActivity).getPlaybackState() != null &&
            MediaControllerCompat.getMediaController(mActivity).getPlaybackState().getState() == PlaybackStateCompat.STATE_PLAYING) {

            int episodeID = mMediaBrowserCompat.getExtras().getInt("episodeid"); //always returns 0

            //also tried this but getExtras is null
            int episodeID = MediaControllerCompat.getMediaController(mActivity).getExtras().getInt("episodeid");

        }
    }
}

public class MediaPlayerService extends MediaBrowserServiceCompat {

    private MediaSessionCompat mMediaSessionCompat;

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

        final ComponentName mediaButtonReceiver = new ComponentName(getApplicationContext(), MediaButtonReceiver.class);
        mMediaSessionCompat = new MediaSessionCompat(getApplicationContext(), getString(R.string.app_name), mediaButtonReceiver, null);
        mMediaSessionCompat.setCallback(mMediaSessionCallback);
        ...
    }       

    private MediaSessionCompat.Callback mMediaSessionCallback = new MediaSessionCompat.Callback() {
        @Override
        public void onPlayFromUri(final Uri uri, final Bundle extras) {
            super.onPlayFromUri(uri, extras);

            int episodeId = extras.getInt("episodeid");

            String url = GetUrl(episodeId);

            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setDataSource(uri);
            mMediaPlayer.prepareAsync();
            ...             
        }
    }
}

1 Ответ

0 голосов
/ 20 января 2020

media_controller.getMetadata (). GetDescription (). GetMediaId () может быть тем, что вы ищете. Если нет, возможно, попробуйте использовать MediaMetadataCompat.Builder (), чтобы установить некоторые метаданные для каждого из ваших эпизодов

MediaMetadataCompat.Builder().putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, episodeID).build()

что-то в этом роде, я не думаю, что вам также нужно использовать METADATA_KEYs, вы, вероятно, можете заменить это с "идентификатором эпизода" или любой строкой, которую вы хотите использовать в качестве ключа.

edit: если вы go маршрут метаданных, вы можете использовать его для создания медиаэлементов.

MediaMetadataCompat episode_meta = new MediaMetadataCompat.Builder()
                    .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, episodeID)
                    .build();

episode_mediaitem = new MediaBrowserCompat.MediaItem(episode_meta.getDescription(), MediaBrowserCompat.MediaItem.FLAG_PLAYABLE));

Надеюсь, я помог

редактировать: использование элементов мультимедиа позволяет использовать media_controller.getMetadata (). GetDescription (). GetMediaId () сверху, я думаю,

...