首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MediaBrowserService获取项目播放

从MediaBrowserService获取项目播放
EN

Stack Overflow用户
提问于 2020-01-06 05:33:32
回答 2查看 461关注 0票数 1

我有一个音频应用程序,带有包含项目列表的家庭Activity。用户选择一个项目,我将一个ID传递给另一个具有控件(播放/暂停/音量等)的Activity。音频播放是在一个MediaBrowserService中进行的。我需要检测用户选择的项目当前是否正在播放,但除了将ID保存在本地存储(SharedPrefs或SQlite)之外,我不知道如何播放。

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

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

代码语言:javascript
复制
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();
            ...             
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-21 01:24:13

media_controller.getMetadata().getDescription().getMediaId()可能就是你要找的东西。如果没有,可以尝试使用MediaMetadataCompat.Builder()为每个剧集设置一些元数据

代码语言:javascript
复制
MediaMetadataCompat.Builder().putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, episodeID).build()

就像这样,我认为你也不需要使用METADATA_KEYs,你可以用“剧集id”或任何你想用作关键字的字符串来代替它。

编辑:如果你走元数据路线,你可能想用它来构建媒体项。

代码语言:javascript
复制
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()

票数 0
EN

Stack Overflow用户

发布于 2021-01-23 17:36:00

代码语言:javascript
复制
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);
    });

在这里,你应该在解析Uri时放入url而不是uri。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59604382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档