Проблема со звуковым файлом в течение l oop xamarin android - PullRequest
0 голосов
/ 19 марта 2020

Используйте итеративную l oop, чтобы извлечь числа и работать хорошо. У меня проблема в том, что я хочу добавить звук при завершении процесса, и каждый раз, когда процесс будет завершен, будет звук, я использовал следующий код, но звук появляется иногда, а не.

OnCreate
  _player = MediaPlayer.Create(this, Resource.Raw.beep);

  string[] words = str.Split("\n");
foreach (var word in words)
                    {
                     if (!word.Any(c => c < '0' || c > '9'))
                            {
                                txtView.Text = word;
                                _player.Start();
                                buttn.Visibility = ViewStates.Invisible;
                              _player.Stop();

                              }
                        }

1 Ответ

0 голосов
/ 20 марта 2020

Надеюсь, это поможет.

OnCreate += async (sender, e) => {

    string s = await getNumber(anyStringArg, true, ", ");

    if (s != "")
    {
        txtView.Text = s;
        buttn.Visibility = ViewStates.Invisible;

        if (_player != null) _player.reset();

        try
        {
            _player = await prepareMediaPlayer(Resource.Raw.beep);

           _player.start();
        }
        catch (Exception ex)
        {
            // your exception handler
        }
    }
}

async Task<string> getNumber(string str, bool isAll = false, string separator = "")
{
    if (str != "")
    {
        string[] words = str.Split("\n");

        // only first number match 
        if (!isAll)
        {
            int i = 0, n = words.Length();
            while (i < n && !isNumber(words[i])) i++;
            if (i < n) return words[i];
        }

        // all numbers
        else
        {
            List<string> nums = new List<string>();

            foreach (string word in words)
            {
                if (isNumber(word))
                {
                    nums.Add(word);
                }
            }

           return String.Join(separator, nums);
        }
    }

    return "";
}

bool isNumber(string str)
{
    int i = 0, n = str.Length();
    while (i < n && !(str[i] < '0' || str[i] > '9')) i++;
    return n > 0 && i == n;
}

/*  If you are not use custom Task,
     you can avoid problem on unasync Prepare()
     by invoke MediaPlayer.PrepareAsync()
     after the MediaPlayer.Create(). */

async Task<MediaPlayer> prepareMediaPlayer(url)
{
    MediaPlayer mediaPlayer;

    await Task.Run(() => {
         mediaPlayer = MediaPlayer.Create(this, url);
    });

   return mediaPlayer;
}
...