[英]Get item playing from MediaBrowserService
我有一個包含項目列表的家庭Activity
的音頻應用程序。 用戶選擇一個項目,然后我將一個 ID 傳遞給另一個具有控件(播放/暫停/音量等)的Activity
。 音頻播放交給MediaBrowserService
。 我需要檢測用戶選擇的項目當前是否正在播放,但我無法弄清楚如何將 ID 保存在本地存儲(SharedPrefs 或 SQlite)中。
我通過Bundle
將項目的 ID 從第二個Activity
傳遞給MediaBrowserService
。 我以為我可以使用getExtras()
在第二個Activity
檢索 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();
...
}
}
}
media_controller.getMetadata().getDescription().getMediaId() 可能就是你要找的。 如果沒有,可以嘗試使用 MediaMetadataCompat.Builder() 為每個劇集設置一些元數據
MediaMetadataCompat.Builder().putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, episodeID).build()
類似的東西,我認為您也不需要使用 METADATA_KEYs,您可以將其替換為“episode id”或您想用作鍵的任何字符串。
編輯:如果你走元數據路線,你可能想用它來構建媒體項目。
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(),我認為
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 中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.