/// <summary> /// Updates the metadata on the lock screen /// </summary> private void UpdateMediaMetadataCompat(MediaMetadataRetriever metaRetriever = null) { if (mediaSession == null) { return; } MediaMetadata.Builder builder = new MediaMetadata.Builder(); if (metaRetriever != null) { builder .PutString(MediaMetadata.MetadataKeyAlbum, metaRetriever.ExtractMetadata(MetadataKey.Album)) .PutString(MediaMetadata.MetadataKeyArtist, metaRetriever.ExtractMetadata(MetadataKey.Artist)) .PutString(MediaMetadata.MetadataKeyTitle, metaRetriever.ExtractMetadata(MetadataKey.Title)); } else { builder .PutString(MediaMetadata.MetadataKeyAlbum, mediaSession.Controller.Metadata.GetString(MediaMetadata.MetadataKeyAlbum)) .PutString(MediaMetadata.MetadataKeyArtist, mediaSession.Controller.Metadata.GetString(MediaMetadata.MetadataKeyArtist)) .PutString(MediaMetadata.MetadataKeyTitle, mediaSession.Controller.Metadata.GetString(MediaMetadata.MetadataKeyTitle)); } builder.PutBitmap(MediaMetadata.MetadataKeyAlbumArt, Cover as Bitmap); mediaSession.SetMetadata(builder.Build()); }
void UpdateMetadata() { if (!QueueHelper.isIndexPlayable(currentIndexOnQueue, playingQueue)) { LogHelper.Error(Tag, "Can't retrieve current metadata."); UpdatePlaybackState(Resources.GetString(Resource.String.error_no_metadata)); return; } var queueItem = playingQueue [currentIndexOnQueue]; var musicId = MediaIDHelper.ExtractMusicIDFromMediaID( queueItem.Description.MediaId); var track = musicProvider.GetMusic(musicId); var trackId = track.GetString(MediaMetadata.MetadataKeyMediaId); if (musicId != trackId) { var e = new InvalidOperationException("track ID should match musicId."); LogHelper.Error(Tag, "track ID should match musicId.", " musicId=", musicId, " trackId=", trackId, " mediaId from queueItem=", queueItem.Description.MediaId, " title from queueItem=", queueItem.Description.Title, " mediaId from track=", track.Description.MediaId, " title from track=", track.Description.Title, " source.hashcode from track=", track.GetString( MusicProvider.CustomMetadataTrackSource).GetHashCode(), e); throw e; } LogHelper.Debug(Tag, "Updating metadata for MusicID= " + musicId); session.SetMetadata(track); // Set the proper album artwork on the media session, so it can be shown in the // locked screen and in other places. if (track.Description.IconBitmap == null && track.Description.IconUri != null) { var albumUri = track.Description.IconUri.ToString(); AlbumArtCache.Instance.Fetch(albumUri, new AlbumArtCache.FetchListener { OnFetched = (artUrl, bitmap, icon) => { var qItem = playingQueue [currentIndexOnQueue]; var trackItem = musicProvider.GetMusic(trackId); trackItem = new MediaMetadata.Builder(trackItem) .PutBitmap(MediaMetadata.MetadataKeyAlbumArt, bitmap) .PutBitmap(MediaMetadata.MetadataKeyDisplayIcon, icon) .Build(); musicProvider.UpdateMusic(trackId, trackItem); // If we are still playing the same music var currentPlayingId = MediaIDHelper.ExtractMusicIDFromMediaID( qItem.Description.MediaId); if (trackId == currentPlayingId) { session.SetMetadata(trackItem); } } }); } }
void LoadChildrenImpl(string parentId, Result result) { LogHelper.Debug(Tag, "OnLoadChildren: parentMediaId=", parentId); var mediaItems = new JavaList <MediaBrowser.MediaItem> (); if (MediaIDHelper.MediaIdRoot == parentId) { LogHelper.Debug(Tag, "OnLoadChildren.ROOT"); mediaItems.Add(new MediaBrowser.MediaItem( new MediaDescription.Builder() .SetMediaId(MediaIDHelper.MediaIdMusicsByGenre) .SetTitle(GetString(Resource.String.browse_genres)) .SetIconUri(Android.Net.Uri.Parse("android.resource://" + "com.example.android.mediabrowserservice/drawable/ic_by_genre")) .SetSubtitle(GetString(Resource.String.browse_genre_subtitle)) .Build(), MediaItemFlags.Browsable )); } else if (MediaIDHelper.MediaIdMusicsByGenre == parentId) { LogHelper.Debug(Tag, "OnLoadChildren.GENRES"); foreach (var genre in musicProvider.Genres) { var item = new MediaBrowser.MediaItem( new MediaDescription.Builder() .SetMediaId(MediaIDHelper.CreateBrowseCategoryMediaID(MediaIDHelper.MediaIdMusicsByGenre, genre)) .SetTitle(genre) .SetSubtitle(GetString(Resource.String.browse_musics_by_genre_subtitle, genre)) .Build(), MediaItemFlags.Browsable ); mediaItems.Add(item); } } else if (parentId.StartsWith(MediaIDHelper.MediaIdMusicsByGenre)) { var genre = MediaIDHelper.GetHierarchy(parentId) [1]; LogHelper.Debug(Tag, "OnLoadChildren.SONGS_BY_GENRE genre=", genre); foreach (var track in musicProvider.GetMusicsByGenre(genre)) { var hierarchyAwareMediaID = MediaIDHelper.CreateMediaID( track.Description.MediaId, MediaIDHelper.MediaIdMusicsByGenre, genre); var trackCopy = new MediaMetadata.Builder(track) .PutString(MediaMetadata.MetadataKeyMediaId, hierarchyAwareMediaID) .Build(); var bItem = new MediaBrowser.MediaItem( trackCopy.Description, MediaItemFlags.Playable); mediaItems.Add(bItem); } } else { LogHelper.Warn(Tag, "Skipping unmatched parentMediaId: ", parentId); } LogHelper.Debug(Tag, "OnLoadChildren sending ", mediaItems.Count, " results for ", parentId); result.SendResult(mediaItems); }
private void LoadChildrenImpl(string parentId, Result result) { var mediaItems = new JavaList <MediaBrowser.MediaItem>(); if (HierarchyHelper.PodcastRoot == parentId) { Logger.Debug("Load ROOT"); mediaItems.Add(new MediaBrowser.MediaItem( new MediaDescription.Builder() .SetMediaId(HierarchyHelper.PodcastsByMonth) .SetTitle("All Playlists") .SetIconUri(Android.Net.Uri.Parse("android.resource://com.henry.mypodcast/drawable/ic_by_genre")) .SetSubtitle("Bursts By Playlist") .Build(), MediaItemFlags.Browsable)); } else if (HierarchyHelper.PodcastsByMonth == parentId) { Logger.Debug("Load BYMONTH List"); foreach (var playlist in _musicProvider._playlists) { var item = new MediaBrowser.MediaItem( new MediaDescription.Builder() .SetMediaId(HierarchyHelper.PodcastsByMonth + HierarchyHelper.CategorySeparator + playlist.Id.ToString()) .SetTitle(playlist.Name) .SetSubtitle($"{playlist.Name} Bursts") .Build(), MediaItemFlags.Browsable); mediaItems.Add(item); } } else if (parentId.StartsWith(HierarchyHelper.PodcastsByMonth)) { var playlistId = int.Parse(HierarchyHelper.GetHierarchy(parentId)[1]); Logger.Debug("Load List of Podcasts for Month"); foreach (var track in _musicProvider.GetMusicsByPlaylist(playlistId)) { var hierarchyAwareMediaID = HierarchyHelper.EncodeMediaID( track.Description.MediaId, HierarchyHelper.PodcastsByMonth, playlistId.ToString()); var trackCopy = new MediaMetadata.Builder(track) .PutString(MediaMetadata.MetadataKeyMediaId, hierarchyAwareMediaID) .Build(); var bItem = new MediaBrowser.MediaItem( trackCopy.Description, MediaItemFlags.Playable); mediaItems.Add(bItem); } } result.SendResult(mediaItems); }
static List <MediaSession.QueueItem> ConvertToQueue(IEnumerable <MediaMetadata> tracks, params string[] categories) { var queue = new List <MediaSession.QueueItem>(); int count = 0; foreach (var track in tracks) { string hierarchyAwareMediaID = MediaIDHelper.CreateMediaID(track.Description.MediaId, categories); MediaMetadata trackCopy = new MediaMetadata.Builder(track) .PutString(MediaMetadata.MetadataKeyMediaId, hierarchyAwareMediaID) .Build(); var item = new MediaSession.QueueItem(trackCopy.Description, count++); queue.Add(item); } return(queue); }
static List<MediaSession.QueueItem> ConvertToQueue( IEnumerable<MediaMetadata> tracks, params string[] categories) { var queue = new List<MediaSession.QueueItem>(); var count = 0; foreach (var track in tracks) { var hierarchyAwareMediaID = MediaIDHelper.CreateMediaID( track.Description.MediaId, categories); var trackCopy = new MediaMetadata.Builder(track) .PutString(MediaMetadata.MetadataKeyMediaId, hierarchyAwareMediaID) .Build(); var item = new MediaSession.QueueItem(trackCopy.Description, count++); queue.Add(item); } return queue; }
void UpdateMetadata () { if (!QueueHelper.isIndexPlayable (currentIndexOnQueue, playingQueue)) { LogHelper.Error (Tag, "Can't retrieve current metadata."); UpdatePlaybackState (Resources.GetString (Resource.String.error_no_metadata)); return; } MediaSession.QueueItem queueItem = playingQueue [currentIndexOnQueue]; string musicId = MediaIDHelper.ExtractMusicIDFromMediaID ( queueItem.Description.MediaId); MediaMetadata track = musicProvider.GetMusic (musicId); string trackId = track.GetString (MediaMetadata.MetadataKeyMediaId); if (musicId != trackId) { var e = new InvalidOperationException ("track ID should match musicId."); LogHelper.Error (Tag, "track ID should match musicId.", " musicId=", musicId, " trackId=", trackId, " mediaId from queueItem=", queueItem.Description.MediaId, " title from queueItem=", queueItem.Description.Title, " mediaId from track=", track.Description.MediaId, " title from track=", track.Description.Title, " source.hashcode from track=", track.GetString ( MusicProvider.CustomMetadataTrackSource).GetHashCode (), e); throw e; } LogHelper.Debug (Tag, "Updating metadata for MusicID= " + musicId); session.SetMetadata (track); // Set the proper album artwork on the media session, so it can be shown in the // locked screen and in other places. if (track.Description.IconBitmap == null && track.Description.IconUri != null) { string albumUri = track.Description.IconUri.ToString (); AlbumArtCache.Instance.Fetch (albumUri, new AlbumArtCache.FetchListener { OnFetched = (artUrl, bitmap, icon) => { MediaSession.QueueItem qItem = playingQueue [currentIndexOnQueue]; MediaMetadata trackItem = musicProvider.GetMusic (trackId); trackItem = new MediaMetadata.Builder (trackItem) .PutBitmap (MediaMetadata.MetadataKeyAlbumArt, bitmap) .PutBitmap (MediaMetadata.MetadataKeyDisplayIcon, icon) .Build (); musicProvider.UpdateMusic (trackId, trackItem); // If we are still playing the same music string currentPlayingId = MediaIDHelper.ExtractMusicIDFromMediaID ( qItem.Description.MediaId); if (trackId == currentPlayingId) { session.SetMetadata (trackItem); } } }); } }
void LoadChildrenImpl (string parentId, Result result) { LogHelper.Debug (Tag, "OnLoadChildren: parentMediaId=", parentId); var mediaItems = new JavaList<MediaBrowser.MediaItem> (); if (MediaIDHelper.MediaIdRoot == parentId) { LogHelper.Debug (Tag, "OnLoadChildren.ROOT"); mediaItems.Add (new MediaBrowser.MediaItem ( new MediaDescription.Builder () .SetMediaId (MediaIDHelper.MediaIdMusicsByGenre) .SetTitle (GetString (Resource.String.browse_genres)) .SetIconUri (Android.Net.Uri.Parse ("android.resource://" + "com.example.android.mediabrowserservice/drawable/ic_by_genre")) .SetSubtitle (GetString (Resource.String.browse_genre_subtitle)) .Build (), MediaItemFlags.Browsable )); } else if (MediaIDHelper.MediaIdMusicsByGenre == parentId) { LogHelper.Debug (Tag, "OnLoadChildren.GENRES"); foreach (var genre in musicProvider.Genres) { var item = new MediaBrowser.MediaItem ( new MediaDescription.Builder () .SetMediaId (MediaIDHelper.CreateBrowseCategoryMediaID (MediaIDHelper.MediaIdMusicsByGenre, genre)) .SetTitle (genre) .SetSubtitle (GetString (Resource.String.browse_musics_by_genre_subtitle, genre)) .Build (), MediaItemFlags.Browsable ); mediaItems.Add (item); } } else if (parentId.StartsWith (MediaIDHelper.MediaIdMusicsByGenre)) { var genre = MediaIDHelper.GetHierarchy (parentId) [1]; LogHelper.Debug (Tag, "OnLoadChildren.SONGS_BY_GENRE genre=", genre); foreach (var track in musicProvider.GetMusicsByGenre(genre)) { var hierarchyAwareMediaID = MediaIDHelper.CreateMediaID ( track.Description.MediaId, MediaIDHelper.MediaIdMusicsByGenre, genre); var trackCopy = new MediaMetadata.Builder (track) .PutString (MediaMetadata.MetadataKeyMediaId, hierarchyAwareMediaID) .Build (); var bItem = new MediaBrowser.MediaItem ( trackCopy.Description, MediaItemFlags.Playable); mediaItems.Add (bItem); } } else { LogHelper.Warn (Tag, "Skipping unmatched parentMediaId: ", parentId); } LogHelper.Debug (Tag, "OnLoadChildren sending ", mediaItems.Count, " results for ", parentId); result.SendResult (mediaItems); }