防止MediaPlayer自动播放文件夹中的所有mp3文件

时间:2012-07-03 01:29:47

标签: android android-mediaplayer

我来自台湾,我的英语非常基础,感谢您的原谅。

我构建了一个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文件路径的串联字符串,根据用户点击的按钮。

非常感谢!

2 个答案:

答案 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;