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); } } }); } }
public void Play(MediaSession.QueueItem item) { var mediaHasChanged = InitPlayerStates(item.Description.MediaId); if (MusicPlayerState == PlaybackStateCode.Paused && !mediaHasChanged && _mediaPlayer != null) { ConfigMediaPlayerState(); } else { MusicPlayerState = PlaybackStateCode.Stopped; CleanUp(false); MediaMetadata track = _musicProvider.GetMusic( HierarchyHelper.ExtractMusicIDFromMediaID(item.Description.MediaId)); string source = track.GetString(MusicProvider.PodcastSource); try { _mediaPlayer.Reset(); MusicPlayerState = PlaybackStateCode.Buffering; _mediaPlayer.SetAudioStreamType(Android.Media.Stream.Music); _mediaPlayer.SetDataSource(source); _mediaPlayer.PrepareAsync(); _wifiLock.Acquire(); _musicService.OnPlaybackStatusChanged(MusicPlayerState); } catch (Exception ex) { Logger.Error(ex, "Error playing song"); _musicService.OnError(ex.Message); } } }
public void Play(MediaSession.QueueItem item) { playOnFocusGain = true; TryToGetAudioFocus(); RegisterAudioNoisyReceiver(); string mediaId = item.Description.MediaId; bool mediaHasChanged = mediaId != currentMediaId; if (mediaHasChanged) { currentPosition = 0; currentMediaId = mediaId; } if (State == PlaybackStateCode.Paused && !mediaHasChanged && mediaPlayer != null) { ConfigMediaPlayerState(); } else { State = PlaybackStateCode.Stopped; RelaxResources(false); MediaMetadata track = musicProvider.GetMusic( MediaIDHelper.ExtractMusicIDFromMediaID(item.Description.MediaId)); string source = track.GetString(MusicProvider.CustomMetadataTrackSource); try { CreateMediaPlayerIfNeeded(); State = PlaybackStateCode.Buffering; mediaPlayer.SetAudioStreamType(Android.Media.Stream.Music); mediaPlayer.SetDataSource(source); mediaPlayer.PrepareAsync(); wifiLock.Acquire(); if (Callback != null) { Callback.OnPlaybackStatusChanged(State); } } catch (IOException ex) { LogHelper.Error(Tag, ex, "Exception playing song"); if (Callback != null) { Callback.OnError(ex.Message); } } } }
internal static void StartNotification( Context context, MediaMetadata mediaMetadata, AndroidMedia.Session.MediaSession mediaSession, Object largeIcon, bool isPlaying) { var pendingIntent = PendingIntent.GetActivity( context, 0, new Intent(context, typeof(MainActivity)), PendingIntentFlags.UpdateCurrent); MediaMetadata currentTrack = mediaMetadata; MediaStyle style = new MediaStyle(); style.SetMediaSession(mediaSession.SessionToken); var builder = new Notification.Builder(context, CHANNEL_ID) .SetStyle(style) .SetContentTitle(currentTrack.GetString(MediaMetadata.MetadataKeyTitle)) .SetContentText(currentTrack.GetString(MediaMetadata.MetadataKeyArtist)) .SetSubText(currentTrack.GetString(MediaMetadata.MetadataKeyAlbum)) .SetSmallIcon(Resource.Drawable.player_play) .SetLargeIcon(largeIcon as Bitmap) .SetContentIntent(pendingIntent) .SetShowWhen(false) .SetOngoing(isPlaying) .SetVisibility(NotificationVisibility.Public); builder.AddAction(NotificationHelper.GenerateActionCompat(context, Drawable.IcMediaPrevious, "Previous", MediaPlayerService.ActionPrevious)); AddPlayPauseActionCompat(builder, context, isPlaying); builder.AddAction(NotificationHelper.GenerateActionCompat(context, Drawable.IcMediaNext, "Next", MediaPlayerService.ActionNext)); style.SetShowActionsInCompactView(0, 1, 2); NotificationManagerCompat.From(context).Notify(NotificationId, builder.Build()); }
private void SetCustomAction(PlaybackState.Builder stateBuilder) { MediaMetadata currentMusic = GetCurrentPlayingMusic(); if (currentMusic != null) { // Set appropriate "Favorite" icon on Custom action: var musicId = currentMusic.GetString(MediaMetadata.MetadataKeyMediaId); var favoriteIcon = Resource.Drawable.ic_star_off; if (_musicProvider.IsFavorite(musicId)) { favoriteIcon = Resource.Drawable.ic_star_on; } stateBuilder.AddCustomAction(CustomActionFavorite, "Favorite", favoriteIcon); } }
public void UpdateMusic(string musicId, MediaMetadata metadata) { var track = musicListById [musicId]; if (track == null) { return; } var oldGenre = track.Metadata.GetString(MediaMetadata.MetadataKeyGenre); var newGenre = metadata.GetString(MediaMetadata.MetadataKeyGenre); track.Metadata = metadata; if (oldGenre != newGenre) { BuildListsByGenre(); } }
void SetCustomAction(PlaybackState.Builder stateBuilder) { MediaMetadata currentMusic = GetCurrentPlayingMusic(); if (currentMusic != null) { // Set appropriate "Favorite" icon on Custom action: var musicId = currentMusic.GetString(MediaMetadata.MetadataKeyMediaId); var favoriteIcon = Resource.Drawable.ic_star_off; if (musicProvider.IsFavorite(musicId)) { favoriteIcon = Resource.Drawable.ic_star_on; } LogHelper.Debug(Tag, "updatePlaybackState, setting Favorite custom action of music ", musicId, " current favorite=", musicProvider.IsFavorite(musicId)); stateBuilder.AddCustomAction(CustomActionThumbsUp, GetString(Resource.String.favorite), favoriteIcon); } }
private void UpdateMetadata() { if (!this.isIndexPlayable(_currentIndexQueue, _playingQueue)) { Logger.Error("Can't retrieve current metadata."); UpdatePlaybackState("Error no data."); return; } MediaSession.QueueItem queueItem = _playingQueue[_currentIndexQueue]; string musicId = HierarchyHelper.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."); throw e; } Logger.Debug($"Updating metadata for MusicID= {musicId}"); _session.SetMetadata(track); }
public void UpdateMusic (string musicId, MediaMetadata metadata) { var track = musicListById [musicId]; if (track == null) return; var oldGenre = track.Metadata.GetString (MediaMetadata.MetadataKeyGenre); var newGenre = metadata.GetString (MediaMetadata.MetadataKeyGenre); track.Metadata = metadata; if (oldGenre != newGenre) BuildListsByGenre (); }
private void Jukebox_MediaEvent(object sender, MediaActionEventArgs e) { switch (e.MediaActionFlags) { case MediaActionFlags.Play: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPlay)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPlay)); break; case MediaActionFlags.Pause: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPause)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPause)); OnPlaybackStateChanged(RemoteControlPlayState.Paused); //Workaround: Manually Notifying that the media has been paused. //because Android is mediocre and won't do this, so my app won't know if the media was paused. //This could lead to some fun bugs, but //It's the best approach I have found. break; case MediaActionFlags.SkipToNext: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaNext)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaNext)); break; case MediaActionFlags.SkipToPrevious: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPrevious)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPrevious)); break; case MediaActionFlags.SeekTo: TransportControls.SeekTo(e.Time); break; case MediaActionFlags.FastFoward: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaFastForward)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaFastForward)); break; case MediaActionFlags.Rewind: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaRewind)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaRewind)); break; case MediaActionFlags.Stop: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaStop)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaStop)); break; case MediaActionFlags.Replay: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaStop)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaStop)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPlay)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPlay)); break; case MediaActionFlags.RetrieveMediaInformation: //Send media information. OnMediaMetadataChanged(new MediaMetadataChangedKitkatEventArgs { Title = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Title, ""), Artist = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Artist, ""), Album = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Album, ""), AlbumArt = MediaMetadata.GetBitmap(MediaMetadataEditKey.BitmapKeyArtwork, null), Duration = MediaMetadata.GetLong((MediaMetadataEditKey)MetadataKey.Duration, 0) }); //Send Playbackstate of the media. OnMediaPlaybackChanged(new MediaPlaybackStateChangedKitkatEventArgs { PlaybackState = PlaybackState, CurrentTime = CurrentMediaPosition, }); break; default: break; } }
private void Jukebox_MediaEvent(object sender, MediaActionEventArgs e) { switch (e.MediaActionFlags) { case MediaActionFlags.Play: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPlay)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPlay)); break; case MediaActionFlags.Pause: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPause)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPause)); break; case MediaActionFlags.SkipToNext: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaNext)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaNext)); break; case MediaActionFlags.SkipToPrevious: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPrevious)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPrevious)); break; case MediaActionFlags.SeekTo: TransportControls.SeekTo(e.Time); break; case MediaActionFlags.FastFoward: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaFastForward)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaFastForward)); break; case MediaActionFlags.Rewind: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaRewind)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaRewind)); break; case MediaActionFlags.Stop: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaStop)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaStop)); break; case MediaActionFlags.RetrieveMediaInformation: //Send media information. OnMediaMetadataChanged(new MediaMetadataChangedKitkatEventArgs { Title = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Title, ""), Artist = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Artist, ""), Album = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Album, ""), AlbumArt = MediaMetadata.GetBitmap(MediaMetadataEditKey.BitmapKeyArtwork, null), Duration = MediaMetadata.GetLong((MediaMetadataEditKey)MetadataKey.Duration, 0) }); //Send Playbackstate of the media. OnMediaPlaybackChanged(new MediaPlaybackStateChangedKitkatEventArgs { PlaybackState = PlaybackState, CurrentTime = CurrentMediaPosition, }); break; default: break; } }