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()たときに例外がスローされることはありませんが、2 回目のループでは例外がスローされます。ステート マシン図を参照してください... MediaRecorder

また、doInBackground(...)スレッドを終了するタイミングを検出するためにAsyncTask、UI スレッドから呼び出してキャンセルできるメソッドがあります。

ループは理想的にはである必要があり、メイン コードでのリスナーからメソッドwhile (!isCancelled())を呼び出す必要があります(がまたはその他のであると仮定します)。AsyncTask.cancel(...)onCheckedChangedtbActivitytbCheckBoxCompoundButton

于 2012-06-11T17:15:51.947 に答える