CrossMediaManager MediaItemFinished дает статус воспроизведения вместо остановки в Xamarin Forms - PullRequest
0 голосов
/ 26 мая 2020

Я проигрываю аудиофайлы из библиотеки устройства с помощью плагина CrossMediaManager . Он воспроизводит файлы правильно, однако в статусе MediaitemFinised вместо stopped я получаю статус playing. Я пытаюсь воспроизвести другой файл или прекратить воспроизведение в зависимости от некоторых настроек. например, если пользовательские настройки настроены для следующего воспроизведения, я выбираю другой файл и воспроизводю следующий элемент, но мне нужно сделать это после того, как воспроизведение первого элемента будет полностью завершено.

    void AddCrossMediaHandlers()
    {
       CrossMediaManager.Current.StateChanged += Current_StateChanged;
       CrossMediaManager.Current.MediaItemFinished += Current_MediaItemFinished;
       CrossMediaManager.Current.MediaPlayer.BeforePlaying += MediaPlayer_BeforePlaying;
    }
    void RemoveCrossMediaHandlers()
    {
       CrossMediaManager.Current.StateChanged -= Current_StateChanged;
       CrossMediaManager.Current.MediaItemFinished -= Current_MediaItemFinished;
       CrossMediaManager.Current.MediaPlayer.BeforePlaying -= MediaPlayer_BeforePlaying;
    }
    private void Button_Clicked(object sender, EventArgs e)
    {
        StartPlaying(someFilePath);
    }
    async void StartPlaying(filePath)
    {
       var player = CrossMediaManager.Current;
       if (player.State != MediaManager.Player.MediaPlayerState.Playing)
       {
          if (!string.IsNullOrEmpty(filePath))
               await player.Play(new FileInfo(filePath));
       }
    }
    private void Current_MediaItemFinished(object sender, MediaManager.Media.MediaItemEventArgs e)
    {
       Debug.WriteLine("item Finished event: " + CrossMediaManager.Current.State); //this return playing status therefore it doesen't play the next file.
//When media is finished look for user setting and play next or stop playing.
       if (playNext) //I also checked !CrossMediaManager.Current.IsPlaying(), but didn't help.
          StartPlaying(NextFilePath); //This fire, but because the status is playing, it doesn't play next.
    }

1 Ответ

0 голосов
/ 27 мая 2020

Решил. На случай, если это кому-то понадобится. Я добавил Task.Delay (миллисекунды), чтобы дождаться остановки игрока.

private void Current_MediaItemFinished(object sender, MediaManager.Media.MediaItemEventArgs e)
    {
       Debug.WriteLine("item Finished event: " + CrossMediaManager.Current.State); //this return playing status therefore it doesen't play the next file.
       var player = CrossMediaManager.Current.MediaPlayer;
       await player.Stop(); //stop playing explicitly
       await Task.Delay(TimeSpan.FromSeconds(1)); // add a delay (you can add milliseconds)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...