我来自台湾,我的英语非常基础,感谢您的原谅。
我构建了一个iPad应用程序并发布到App Store,这是一种沟通板(对于说话困难的人来说是AAC)。它在主视图上有几个按钮,当用户触摸一个按钮时,应用程序将播放与该按钮对应的mp3声音。我已将所有mp3文件放在一个文件夹中,并确定在运行时动态播放哪个文件。
最近我正在构建这个应用程序的Android版本,但我遇到的问题是,当我在视图上触摸一个按钮时,MediaPlayer不仅播放相应的一个,而且继续播放所有其余的mp3文件在文件夹上不断。它不会发生在iPad版的开发上。任何人都可以帮我解决这个问题,并将MediaPlayer设置为正常工作?
PS。我将所有MP3文件放在一些子文件夹中,并将它们放在“assets”文件夹中。这是因为由于某些原因,所有mp3文件都使用数字文件名(例如0123223.mp3),并且播放的MP3是根据用户触摸的按钮,因此我不能使用R.raw.0123223 R类不能有一个以数字命名的成员,而且目标mp3文件只能在运行时而不是编译时确定,所以我不能使用res / raw文件夹。
我的代码如下:
private void PlayMP3(String mp3File) throws IOException {
AssetFileDescriptor afd = this.getAssets().openFd(mp3File);
MediaPlayer player = new MediaPlayer();
player.setOnCompletionListener(new OnCompletionListener(){
public void onCompletion(MediaPlayer mp) {
System.out.println(mp.getAudioSessionId() + " finished.");
}
});
player.setDataSource(afd.getFileDescriptor());
player.setLooping(false);
player.prepare();
player.start();
}
PlayMP3的参数“mp3file”是mp3文件路径的串联字符串,根据用户点击的按钮。
非常感谢!
答案 0 :(得分:4)
如果资源目录中只有一个文件,那么您的版本将有效。资产目录内容一个接一个地放在一起。因此,如果您没有指定从哪里开始以及要读取多少字节,则播放器将读取到最后,就好像它们是一个文件一样。
您可以使用带有更多参数的setDataSource来完成您想要的任务:
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
这将允许您定义播放器的限制,并且只播放您在字符串mp3File中指定的歌曲。
答案 1 :(得分:0)
你没有发布一些代码。
第一步是将声音文件插入原始文件夹
然后,您只需要几行代码:
MediaPlayer mediaPlayer = null;
mediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.mysoundfile);
mediaPlayer.start();
当应用程序关闭时,不要忘记“释放”您的媒体播放器:
mediaPlayer.release();
mediaPlayer = null;