5

シンプルな Android オーディオ レコーダーを開発しようとしています。すべてが正常にビルドされ、Android デバイスでも正常に動作します。録音を開始できるようですが、停止しようとすると IllegalStateException がスローされます。間違いが見つかりません。コードは次のとおりです。

public class VoiceRecorder {
MediaRecorder recorder= new MediaRecorder();
static Context cont;

public void startRecord(Context context) throws IllegalStateException, IOException{
    cont = context;

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setOutputFile(cont.getFilesDir()+"/recordings.3gp"); 
    recorder.prepare();
    recorder.start();  

 }  
public void stopRecording(Context context) {
    cont = context;
    recorder.stop();
    recorder.release();
    File file = new File (cont.getFilesDir()+"/recordings.3gp");
    UploadFile.uploadFile("recordings.3gp", file);
    recorder = null;
 }
}

私はそれをトリガーしたい:

VoiceRecorder vr = new VoiceRecorder();

vr.startRecord(続き);

vr.stopRecording(続き);

start Logcat を呼び出すと、次のように表示されます: (何が問題ないか)

09-06 22:56:42.830: D/AudioHardwareMSM72XX(123): audpre_index = 0, tx_iir_index = 0
09-06 22:56:42.840: D/HTC Acoustic(123): msm72xx_enable_audpre: 0x0000
09-06 22:56:42.850: I/AudioHardwareMSM72XX(123): Routing audio to Speakerphone
09-06 22:56:42.850: D/HTC Acoustic(123): msm72xx_enable_audpp: 0x0001
09-06 22:56:42.850: I/AudioHardwareMSM72XX(123): Routing audio to Speakerphone
09-06 22:56:42.860: D/HTC Acoustic(123): msm72xx_enable_audpp: 0x0001
09-06 22:56:42.870: D/AudioFlinger(123): setParameters(): io 3, keyvalue routing=262144;vr_mode=0, tid 156, calling tid 123
09-06 22:56:42.870: I/AudioHardwareMSM72XX(123): Routing audio to Speakerphone
09-06 22:56:42.880: D/AudioHardwareMSM72XX(123): audpre_index = 0, tx_iir_index = 0
09-06 22:56:42.880: D/HTC Acoustic(123): msm72xx_enable_audpre: 0x0000
09-06 22:56:42.880: I/AudioHardwareMSM72XX(123): do input routing device 40000
09-06 22:56:42.880: I/AudioHardwareMSM72XX(123): Routing audio to Speakerphone
09-06 22:56:42.890: D/HTC Acoustic(123): msm72xx_enable_audpp: 0x0001

しかし、停止を呼び出すと:

09-06 22:59:52.440: E/MediaRecorder(1069): stop called in an invalid state: 1
09-06 22:59:52.440: W/System.err(1069): java.lang.IllegalStateException
09-06 22:59:52.460: W/System.err(1069):     at android.media.MediaRecorder.stop(Native Method)
09-06 22:59:52.460: W/System.err(1069):     at de.spyapp.VoiceRecorder.stopRecording(VoiceRecorder.java:33)
09-06 22:59:52.460: W/System.err(1069):     at de.spyapp.CheckCMD.checkCMD(CheckCMD.java:30)
09-06 22:59:52.460: W/System.err(1069):     at de.spyapp.AppActivity$2.run(AppActivity.java:44)
09-06 22:59:52.460: W/System.err(1069):     at java.lang.Thread.run(Thread.java:1096)
4

2 に答える 2

5

問題は停止ではなく、開始です。正しく開始されないため、後で停止することはできません。

いくつかのことを確認してください:a)許可 android.permission.RECORD_AUDIO を追加したこと

b) SD カードへの書き込み (必須かどうかはわかりませんが、内部メモリへの書き込みに問題があったと思います)。SD カードへの書き込み権限が必要です。

c) また、 onErrorListener http://developer.android.com/reference/android/media/MediaPlayer.html#setOnErrorListener(android.media.MediaPlayer.OnErrorListener )を設定してみてください。

d) この記事 http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States Android の MediaRecorder 状態は悪夢です。

于 2012-09-06T21:23:26.807 に答える
2

無効な状態から stop() を呼び出すと、そのエラーがスローされるようです。

レコーダーのアクティビティ サイクルも、記録を開始する前に prepare() する必要があることを示しているようです。そうしていますか? レコーダーが少なくとも準備されていない限り、stop() は有効なコマンドではありません。

もしそうなら、後で stop() を呼び出す前に、レコーダーが実際に有効な状態に落ち着くまで少し時間がかかるかもしれません。start() の直後に呼び出しているため、そこで何かが起こっている可能性があります。

于 2012-09-06T21:15:18.583 に答える