我正在使用Google提供的Universal Music Player (UMP)
示例代码。
在这里,我想按照自己的customize
来对事物进行requirement
,但UMP
在以下过程中仍然有效:
Screen 1: Genres (Songs by genre)
Screen 2: List of Genres
Screen 3: List of Songs (under particular Genre)
现在,这是我的
requirement
:我不需要
Screen 1: Genres (Songs by genre)
,我想直接从Screen 2
启动我的应用程序(即:List of Genres
屏幕)为了达到目标,我对
MusicService.java
类做了一些小的更改。我在代码下面有
replaced
:/**
* Actual implementation of onLoadChildren that assumes that MusicProvider is already
* initialized.
*/
private void loadChildrenImpl(final String parentMediaId,
final Result<List<MediaBrowser.MediaItem>> result) {
LogHelper.d(TAG, "OnLoadChildren: parentMediaId=", parentMediaId);
List<MediaBrowser.MediaItem> mediaItems = new ArrayList<>();
if (MEDIA_ID_ROOT.equals(parentMediaId)) {
LogHelper.d(TAG, "OnLoadChildren.ROOT");
mediaItems.add(new MediaBrowser.MediaItem(
new MediaDescription.Builder()
.setMediaId(MEDIA_ID_MUSICS_BY_GENRE)
.setTitle(getString(R.string.browse_genres))
.setIconUri(Uri.parse("android.resource://" +
"com.example.android.uamp/drawable/ic_by_genre"))
.setSubtitle(getString(R.string.browse_genre_subtitle))
.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE
));
} else if (MEDIA_ID_MUSICS_BY_GENRE.equals(parentMediaId)) {
LogHelper.d(TAG, "OnLoadChildren.GENRES");
for (String genre : mMusicProvider.getGenres()) {
MediaBrowser.MediaItem item = new MediaBrowser.MediaItem(
new MediaDescription.Builder()
.setMediaId(createBrowseCategoryMediaID(MEDIA_ID_MUSICS_BY_GENRE, genre))
.setTitle(genre)
.setSubtitle(getString(R.string.browse_musics_by_genre_subtitle, genre))
.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE
);
mediaItems.add(item);
}
} else if (parentMediaId.startsWith(MEDIA_ID_MUSICS_BY_GENRE)) {
String genre = MediaIDHelper.getHierarchy(parentMediaId)[1];
LogHelper.d(TAG, "OnLoadChildren.SONGS_BY_GENRE genre=", genre);
for (MediaMetadata track : mMusicProvider.getMusicsByGenre(genre)) {
// Since mediaMetadata fields are immutable, we need to create a copy, so we
// can set a hierarchy-aware mediaID. We will need to know the media hierarchy
// when we get a onPlayFromMusicID call, so we can create the proper queue based
// on where the music was selected from (by artist, by genre, random, etc)
String hierarchyAwareMediaID = MediaIDHelper.createMediaID(
track.getDescription().getMediaId(), MEDIA_ID_MUSICS_BY_GENRE, genre);
MediaMetadata trackCopy = new MediaMetadata.Builder(track)
.putString(MediaMetadata.METADATA_KEY_MEDIA_ID, hierarchyAwareMediaID)
.build();
MediaBrowser.MediaItem bItem = new MediaBrowser.MediaItem(
trackCopy.getDescription(), MediaItem.FLAG_PLAYABLE);
mediaItems.add(bItem);
}
} else {
LogHelper.w(TAG, "Skipping unmatched parentMediaId: ", parentMediaId);
}
LogHelper.d(TAG, "OnLoadChildren sending ", mediaItems.size(),
" results for ", parentMediaId);
result.sendResult(mediaItems);
}
使用
following
代码:/**
* Actual implementation of onLoadChildren that assumes that MusicProvider is already
* initialized.
*/
private void loadChildrenImpl(final String parentMediaId,
final Result<List<MediaBrowser.MediaItem>> result) {
LogHelper.d(TAG, "OnLoadChildren: parentMediaId=", parentMediaId);
List<MediaBrowser.MediaItem> mediaItems = new ArrayList<>();
if (MEDIA_ID_MUSICS_BY_GENRE.equals(parentMediaId)) {
LogHelper.d(TAG, "OnLoadChildren.GENRES");
for (String genre : mMusicProvider.getGenres()) {
MediaBrowser.MediaItem item = new MediaBrowser.MediaItem(
new MediaDescription.Builder()
.setMediaId(createBrowseCategoryMediaID(MEDIA_ID_MUSICS_BY_GENRE, genre))
.setTitle(genre)
.setSubtitle(getString(R.string.browse_musics_by_genre_subtitle, genre))
.build(), MediaBrowser.MediaItem.FLAG_BROWSABLE
);
mediaItems.add(item);
}
} else if (parentMediaId.startsWith(MEDIA_ID_MUSICS_BY_GENRE)) {
String genre = MediaIDHelper.getHierarchy(parentMediaId)[1];
LogHelper.d(TAG, "OnLoadChildren.SONGS_BY_GENRE genre=", genre);
for (MediaMetadata track : mMusicProvider.getMusicsByGenre(genre)) {
// Since mediaMetadata fields are immutable, we need to create a copy, so we
// can set a hierarchy-aware mediaID. We will need to know the media hierarchy
// when we get a onPlayFromMusicID call, so we can create the proper queue based
// on where the music was selected from (by artist, by genre, random, etc)
String hierarchyAwareMediaID = MediaIDHelper.createMediaID(
track.getDescription().getMediaId(), MEDIA_ID_MUSICS_BY_GENRE, genre);
MediaMetadata trackCopy = new MediaMetadata.Builder(track)
.putString(MediaMetadata.METADATA_KEY_MEDIA_ID, hierarchyAwareMediaID)
.build();
MediaBrowser.MediaItem bItem = new MediaBrowser.MediaItem(
trackCopy.getDescription(), MediaItem.FLAG_PLAYABLE);
mediaItems.add(bItem);
}
} else {
LogHelper.w(TAG, "Skipping unmatched parentMediaId: ", parentMediaId);
}
LogHelper.d(TAG, "OnLoadChildren sending ", mediaItems.size(),
" results for ", parentMediaId);
result.sendResult(mediaItems);
}
当我启动我的应用程序而不是
List of Genres
时,我得到了一个message
,上面写着:"Error Loading Media"
所以这里是
what's wrong
,我的代码中是Where I have to make change
吗? To get List of Genres
直接 最佳答案
问题在于,UMP仍然使用loadChildrenImpl()
调用parentMediaId == __ROOT__
。
因此,它无法在if-else语句中找到合适的大小写并最终出现在
LogHelper.w(TAG, "Skipping unmatched parentMediaId: ", parentMediaId);
并返回空
mediaItems
(这会导致“错误加载媒体”错误)修复程序在
MusicService
类中,在onGetRoot()
方法中替换 return new BrowserRoot(MEDIA_ID_ROOT, null);
与
return new BrowserRoot(MEDIA_ID_MUSICS_BY_GENRE, null);