1

我正在尝试在 Android 编程中使用 MediaPlayer 在 Eclipse 中播放音频文件。我需要运行保存在计算机硬盘上的音频文件(.wav 或 .mp3)。我已经尝试了很多东西。我还尝试将文件复制到项目的 res 文件夹中,但没有任何效果。下面是我的代码。如您所见,我尝试了很多方法并发表了一些评论。我第一次得到 IOException 之前。但是在使用 MediaPlayer.create() 之后,我得到了 IllegalStateException。任何帮助将不胜感激。

public void playSound(MainActivity mainActivity){
    System.out.println("in playsound");
    MediaPlayer mp = null;
    FileInputStream fis = null;

     try {
         //fis = new FileInputStream("C:\\Users\\Anupam-PC\\Downloads\\trailsoundfilerecordings\\jagmeet.wav");

         //mp.setDataSource(fis.getFD());
         System.out.println("inside try");
         //mp.setDataSource("/res/raw/hai.wav");
         //mp.setDataSource("C:\\Users\\Anupam-PC\\Downloads\\trailsoundfilerecordings\\jagmeet.wav");
         //mp.setDataSource("android.resource://com.example.texttospeech/agreji.mp3");
         //mp.setDataSource("agreji.mp3");

         mp = MediaPlayer.create(mainActivity, R.raw.hai);
         System.out.println("after DS");
         mp.prepare();
         System.out.println("after prepare");
            mp.start();

           // fis.close();
        } catch (Exception e) {
            System.out.println(e);
        } finally{
            try{
                fis.close();
            } catch (Exception e){

            }
        }
4

2 回答 2

1

你不需要实现mp.prepare();,你有create(/**/)

这是我的例子,就像一个魅力:

class Vulcan implements MediaPlayer.OnPreparedListener{

MediaPlayer mediaPlayer = null;
...

boolean isPrepearedToPlayAudio = false; 

mediaPlayer=MediaPlayer.create(context,R.raw.mini_vulcan_gun_1);

mediaPlayer.setOnPreparedListener(this);


public void stop(){

    mediaPlayer.pause();
}


public void start(){

    if(isPrepearedToPlayAudio){
               mediaPlayer.start();
       mediaPlayer.setLooping( true );
            } 
}


@Override
public void onPrepared(MediaPlayer mp) {
    isPrepearedToPlayAudio = true;
}
于 2013-07-31T20:16:53.837 回答
0

您调用MediaPlayer.create(...)已经调用prepare(),并且多次调用prepare()将导致 ISE。您需要做的就是删除:

mp.prepare();

爪哇文档

为给定资源 ID 创建 MediaPlayer 的便捷方法。成功时,prepare() 将已经被调用,并且不能再次调用。

完成 MediaPlayer 后,您应该调用 release() 来释放资源。如果不释放,过多的 MediaPlayer 实例将导致异常。

于 2013-07-31T20:19:13.307 回答