更改媒体播放器的音频源(Android Studio)

Changing audio source for media player (Android Studio)

我正在尝试创建一个按钮,该按钮可在单击时从声音列表中随机播放声音。我的代码将第一个声音随机化,但随后的点击不会触发任何声音。声音播放后是否必须释放编解码器?

meow.setOnClickListener((view) ->{
            Random random = new Random();
            int r = random.nextInt(6-1) + 1;
            Toast.makeText(MainActivity.this,Integer.valueOf(r).toString(),Toast.LENGTH_SHORT).show();
            try{
                if(r==1)
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat1);
                else if (r==2)
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat2);
                else if (r==3)
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat3);
                else if (r==4)
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat4);
                else
                    fileDescriptor = MainActivity.this.getResources().openRawResourceFd(R.raw.meowcat5);
                mp.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());
                mp.prepare();
                mp.start();
            }catch(Exception e){e.printStackTrace();}
        });

你应该检查播放器的状态,pause/stop 如果播放器处于活动状态并在将下一首歌曲加载到

之前调用 mp.release();

第二次和更多点击后,您可能会看到 e.printStackTrace(); 生成的一些 Exception 日志,检查一下,会告诉您哪里出了问题

还可以使用 create 方法,它将加载您的 R.raw 文件和 return new MediaPlayer 的实例.在执行该操作之前释放先前的播放器实例(如果存在)

if (mp!=null) mp.release(); // maybe needs also a  check if playing and stop before?
mp = MediaPlayer.create(view.getContext(), R.raw.meowcat100);
mp.start(); // dont have to call prepare in this case

在设置新数据源之前调用mp.reset()