1

我正在使用 AudioRecorder 录制简短的音频剪辑,但是在调用 AudioRecord.start() 时出现 IllegalStateException 我一直在寻找几个小时,但找不到导致此问题的原因...

我已经设置了 Audio Rec + Write External Storage 权限。

这是我的一段代码:

// main activity...

// Audio inits
    final MediaRecorder recorder = new MediaRecorder();

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(getTempPath());

...

// called the sound rec async

new SoundComponent(tvmic, pb, tb).execute(recorder);

// SoundComponent.java
// Getting IllegalStateException when calling recorder[0].start();

[..]
protected Long doInBackground(MediaRecorder... recorder) {


     try {
         recorder[0].prepare();
        } catch (IOException e) {
            Log.e("100", "prepare() failed");
        }




    while (tb.isChecked())
    {
        //publishProgress();
        //recorder[0].prepare();

         recorder[0].start(); // here it were it throws
         try {
             Thread.sleep(250);
         } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
        // int amplitude = recorder[0].getMaxAmplitude();

         recorder[0].stop();

    }


    // TODO Auto-generated method stub
    return null;
}

[..]

public String getTempPath() // audio temp path
{
    String path =  Environment.getExternalStorageDirectory().getAbsolutePath();
    path+="/temp/audiorectemp.3gp";
    return path;
}
4

1 回答 1

2

MediaRecorder在循环中多次启动和停止可能不是一个好主意。仔细看看你在做什么,我已经修剪了你的代码,使它更容易看到......

while (tb.isChecked())
{
     recorder[0].start(); // here it were it throws
     // Sleep here
     recorder[0].stop();
}

它可能不会在您第一次调用时引发异常,start()但它会在第二个循环中引发。看状态机图... MediaRecorder

此外,为了检测何时doInBackground(...)应该退出线程,有一个方法AsyncTask可以从 UI 线程调用以取消它。

理想情况下,循环应该是并且您应该从主代码中的侦听器while (!isCancelled())调用该AsyncTask.cancel(...)方法(假设是 a或其他一些)。onCheckedChangedtbActivitytbCheckBoxCompoundButton

于 2012-06-11T17:15:51.947 回答