从MediaBrowserService获取播放的项目

问题描述 投票:1回答:1

我有一个音频应用,其家Activity包含一个项目列表。用户选择一个项目,然后将ID传递给另一个具有控件(播放/暂停/音量等)的Activity。音频播放被传送到MediaBrowserService。我需要检测用户选择的项目当前是否正在播放,但是我无法弄清楚将ID保存在本地存储(SharedPrefs或SQlite)之外的方式。

我通过Activity将项目的ID从第二个MediaBrowserService传递到Bundle。我以为我可以使用Activity在第二个getExtras()中检索ID,但它始终返回0或null,这取决于我使用的代码(请参见下文)。

我不反对使用本地存储,但似乎应该有更好的方法。这是我到目前为止的内容:

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

我有一个音频应用,其家庭活动包含项目列表。用户选择一个项目,然后将ID传递给另一个具有控件(播放/暂停/音量等)的Activity。音频...

android android-mediaplayer mediabrowserservicecompat
1个回答
0
投票

media_controller.getMetadata()。getDescription()。getMediaId()可能就是您想要的。如果没有,也许尝试使用MediaMetadataCompat.Builder()为每个情节设置一些元数据

© www.soinside.com 2019 - 2024. All rights reserved.