2

我来自台湾,我的英语很基础,谢谢你的原谅。

我构建了一个 iPad 应用程序并发布到 App Store,这是一种交流板(AAC 用于口语困难的人)。它在主视图上有几个按钮,当用户触摸一个按钮时,应用程序将播放与该按钮对应的 mp3 声音。我已将所有 mp3 文件放在一个文件夹中,并确定在运行时动态播放哪个文件。

最近我正在构建这个应用程序的Android版本,但是我遇到了一个问题,当我触摸视图上的一个按钮时,MediaPlayer不仅播放相应的按钮,而且继续播放文件夹中的所有其余mp3文件不断地。iPad版本的开发不会发生这种情况。任何人都可以帮助我解决这个问题并将 MediaPlayer 设置为正常工作吗?

PS。我将所有 MP3 文件放在一些子文件夹中,然后将它们放在“资产”文件夹中。这是因为由于某些原因,所有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文件路径的串联字符串,根据用户触摸的按钮。

非常感谢!

4

2 回答 2

4

如果您的资产目录中只有一个文件,您的版本就可以工作。资产目录的内容是一个接一个的放在一起。因此,如果您不指定从哪里开始以及要读取多少字节,播放器将读取到最后,就好像它们是一个文件一样。

您可以通过使用带有更多参数的 setDataSource 来完成您想要的:

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

这将允许您定义播放器的限制,并且只播放您在字符串 mp3File 中指定的歌曲。

于 2012-07-03T04:41:40.577 回答
0

你没有发布一些代码。

第一步是将您的声音文件插入原始文件夹

然后,您只需要几行代码:

MediaPlayer mediaPlayer = null;
mediaPlayer = MediaPlayer.create(getBaseContext(), R.raw.mysoundfile);
mediaPlayer.start();     

当应用程序关闭时,不要忘记“释放”您的媒体播放器:

mediaPlayer.release();
mediaPlayer = null;
于 2012-07-03T01:43:25.520 回答