6

I need your help. I tried to play an audio file stored in Assets folder but an error occurred.

Here are my code:

try{
  if (player.isPlaying()) {
    player.stop();
    player.release();
  }
}catch(Exception e){
  Toast.makeText(this, "an exception occurred", Toast.LENGTH_LONG).show();
  e.printStackTrace();
}
try{
  AssetFileDescriptor afd = BeeDailyConvo.this.getAssets().openFd("sounds/hello_kr.wma");
  player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
  player.prepare();
  player.start();
}catch(Exception e){
  e.printStackTrace();
}

And here are my logcat:

06-16 22:39:53.330: W/MediaPlayer(13490): info/warning (1, 26)
06-16 22:39:53.330: E/MediaPlayer(13490): error (1, -4)

Could you please explain what's wrong with my code?

Thank you in advance

Regards,

Priska

4

5 回答 5

4

此问题已得到解决。

资产文件描述符必须在准备播放器之前关闭。这就是我解决问题的方法:

player = new MediaPlayer();
AssetFileDescriptor afd = BeeDailyConvo.this.getAssets()
  .openFd("sounds/"+file);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
afd.close();**//just added this line**
player.prepare();
player.start();
于 2012-06-17T06:08:55.760 回答
3

在这里你可以看到所有错误代码媒体播放器错误代码

-4 错误代码表示您提供了无效的参数。

将您的代码放在 try catch 块中。

尝试使用

    try {
          AssetFileDescriptor afd = CustomListViewActivity.this.getAssets()
                    .openFd("sounds/hello_kr.wma");
            player.setDataSource(afd.getFileDescriptor());
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
于 2012-06-16T16:17:56.983 回答
1

不幸的是,由于某种原因,几乎没有关于 MediaPlayer 错误代码的信息。但是,我建议您尝试将声音文件放入 res/raw/ 而不是资产。

编辑:

从使用MediaPlayer开始从开发者文档中这将向您展示如何正确设置和播放声音。

编辑2:

原来可以从资产做到这一点看到这个问题:从资产目录播放音频文件

于 2012-06-16T16:04:20.203 回答
1

我认为不支持 wma 文件。

http://developer.android.com/guide/appendix/media-formats.html

我注意到您没有指定 audioStreamType

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MISIC);

于 2012-06-16T16:53:09.907 回答
0

使用这种方式它会解决你的问题:)

    public void playBeep() {
    try {

        if (m.isPlaying()) {
            m.stop();
            m.release();
            m = new MediaPlayer();
        }
        AssetFileDescriptor descriptor = getAssets().openFd("mp3 name.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) {
    }
}
于 2012-11-20T07:27:08.373 回答