从资产目录播放audio文件

我有以下代码:

AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3"); player = new MediaPlayer(); player.setDataSource(afd.getFileDescriptor()); player.prepare(); player.start(); 

问题是,当我运行这个代码时,它开始播放资产目录中的所有audio文件,按字母顺序,而不是只播放我请求的audio文件。 我究竟做错了什么? 有没有更好的方法来播放资产目录中的audio文件?

后续问题:将audio文件保存在资源目录中并将其保存在res / raw目录中是否有区别? 除了如果他们在资产目录中,他们没有得到ids。 如果我将audio文件移动到res / raw文件夹,那么在重新使用MediaPlayer会遇到问题,因为setDataSource()没有id参数。 我找不到处理这类问题的好方法。

 player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 

如果资产目录中只有一个文件,那么您的版本可以工作。 资产目录内容实际上不是磁盘上的“真实文件”。 他们都是一个接一个地拼在一起的。 因此,如果您不指定从何处开始读取多less字节,则播放器将读取到最后(即将继续播放资产目录中的所有文件)

此function将正常工作:)

 // MediaPlayer m; /*assume, somewhere in the global scope...*/ public void playBeep() { try { if (m.isPlaying()) { m.stop(); m.release(); m = new MediaPlayer(); } AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.mp3"); m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); descriptor.close(); m.prepare(); m.setVolume(1f, 1f); m.setLooping(true); m.start(); } catch (Exception e) { e.printStackTrace(); } }