在Android Studio中为媒体播放器使用多个音频源
我想创建一个具有多个声音的媒体播放器,并在单击按钮时随机播放一个声音。 我尝试使用MediaPlayer.create()函数,但只能设置一个音频源。 我还尝试使用setDataSource()函数,但这似乎只适用于存储在应用程序外部的资源(据我所知) 这段代码在运行时不会给出任何错误,但在单击时不会播放任何内容 编辑:在第一次单击时有效但在后续单击时无效的更新代码:在Android Studio中为媒体播放器使用多个音频源,android,Android,我想创建一个具有多个声音的媒体播放器,并在单击按钮时随机播放一个声音。 我尝试使用MediaPlayer.create()函数,但只能设置一个音频源。 我还尝试使用setDataSource()函数,但这似乎只适用于存储在应用程序外部的资源(据我所知) 这段代码在运行时不会给出任何错误,但在单击时不会播放任何内容 编辑:在第一次单击时有效但在后续单击时无效的更新代码: meow.setOnClickListener((view) ->{ Random random
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();}
});
R-是具有常量的类。“r.Wr.MeoCAT1”是一个简单的字符串,它不考虑链接到文件的常量。 首先,您需要创建原始常量的int数组,而不是简单字符串的字符串数组。 第二,若要从原始文件播放文件,则需要为该原始文件创建AssetFileDescriptor并在setDataSource方法中使用。例如:
AssetFileDescriptor fileDescriptor = getContext().getResources().openRawResourceFd(R.raw.meowcat1);
mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());
别忘了,请用onDestroy方法发布编解码器。完成!对不起,我是新来的。我用这段代码得到了它,但是它只在第一次点击按钮时起作用,在下一次点击时似乎不会重新分配。有什么建议吗?编辑:用代码更新了原始问题,因为我无法将其放在这里
AssetFileDescriptor fileDescriptor = getContext().getResources().openRawResourceFd(R.raw.meowcat1);
mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());