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);
                        }
                    }
                });
            }
        }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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);
                    }
                }
            }
        }
Пример #4
0
    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());
    }
Пример #5
0
        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();
            }
        }
Пример #7
0
        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);
            }
        }
Пример #8
0
        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);
        }
Пример #9
0
		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 ();
		}
Пример #10
0
        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;
            }
        }
Пример #11
0
        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;
            }
        }