【问题标题】:Playing random sound from raw folder with fisher yates shuffle algorithm on android在android上使用fisher yates shuffle算法从原始文件夹中播放随机声音
【发布时间】:2017-01-05 12:51:37
【问题描述】:

请帮帮我,我想通过一个按钮使用 yate Fisher shuffle 算法随机播放原始文件夹 android studio 的声音。 我使用此代码:

public void playSound() {
    MediaPlayer mp;
    int[] rawSoal = {R.raw.al, R.raw.fear, R.raw.love};
    shuffleArray(rawSoal);
    for (int i = 0; i < rawSoal.length; i++) ;
    try {

        Random random = new Random();
        mp = MediaPlayer.create(this, rawSoal[random.nextInt(rawSoal.length)]);
        mp.start();
        mp.release();

    }catch(Exception e){
        Log.e("ERROR", "Media Player", e);
        mp = null;
    }
}

实现Fisher-Yates shuffle

static void shuffleArray(int[] ar) {
    Random rnd = ThreadLocalRandom.current();
    for (int i = ar.length - 1; i > 0; i--) {
        int index = rnd.nextInt(i + 1);
        int a = ar[index];
        ar[index] = ar[i];
        ar[i] = a;
    }

}

通话按钮:

plybtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            playSound();
            mp.release();

        }
    });

【问题讨论】:

  • 使用上述代码遇到的问题是什么
  • 运行时,不幸的是,已经停止
  • 你为什么用这个:for (int i = 0; i

标签: android algorithm


【解决方案1】:

我认为是因为您在 start() 之后发布了 MediaPlayer。所以音频没有播放。在音频完成时释放 MediaPlayer。

【讨论】:

  • 谢谢,现在我可以随机玩了。但是当我第二次点击播放时,第一个声音仍然播放。我该怎么办?
【解决方案2】:

试试这个:

public void playSound() {
    MediaPlayer mp;
    int[] rawSoal = {R.raw.al, R.raw.fear, R.raw.love};
    shuffleArray(rawSoal);
    try {
        int idx = new Random().nextInt(rawSoal.length);
        mp = MediaPlayer.create(this, rawSoal[idx]);
        mp.start();
        mp.release();

    }catch(Exception e){
        Log.e("ERROR", "Media Player", e);
        mp = null;
    }
}

static void shuffleArray(int[] arr)
    {
        Random rnd = new Random();
        for (int i = arr.length - 1; i > 0; i--)
        {
            int index = rnd.nextInt(i + 1);
            // Swap
            int a = arr[index];
            arr[index] = arr[i];
            arr[i] = a;
        }
    }

【讨论】:

  • 还是不行。
  • 现在我可以随机播放了。但是当我第二次点击播放时,第一个声音仍然播放。我该怎么办?
  • 每次点击按钮时调用 Shuffle 方法。 .
  • 我用一个按钮播放所有音频。但是当我第二次播放时,第一个声音并没有停止。
  • 当您尝试第二次播放时。如果媒体播放器已经在运行,请停止它并释放它,然后重新分配数据源并启动您的播放器。希望它会奏效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2014-03-04
相关资源
最近更新 更多