2012-09-06 12 views
5

Estoy tratando de desarrollar un grabador de audio android simple. Todo funciona bien y también funciona bien en el dispositivo Android. Parece que puedo iniciar la grabación, pero cuando quiero detenerlo arroja una IllegalStateException. No puedo encontrar el error. Aquí está el código:android - MediaRecorder arroja la excepción statestate

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; 
} 
} 

Quiero disparar con:

VoiceRecorder vr = new VoiceRecorder();

vr.startRecord (cont);

vr.stopGrabación (cont);

cuando se llama a iniciar Logcat dice: (lo que debería ser aceptable)

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 

Pero cuando llamo parada:

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) 

Respuesta

2

Parece que se lanza ese error cuando se llama stop() de un estado inválido

El ciclo de actividad para el grabador también parece indicar que necesita para preparar() antes de que pueda comenzar la grabación - haces eso? stop() no es un comando válido a menos que la grabadora esté preparada al menos.

Si es así, tal vez se toma un momento para que la grabadora resolver realmente en un estado válido antes de que más adelante puede llamar stop(). Lo está llamando inmediatamente después del inicio() así que tal vez algo está sucediendo allí.

+1

No se permite publicar más de dos hipervínculos. Algunas lecturas adicionales: - http://stackoverflow.com/questions/11852852/stop-called-in-anvalid-state-1 - http: //www.benmccann.com/dev-blog/android-audio-recording-tutorial/ – TheMaster42

+0

hmm llamé a la preparación antes del inicio y estoy esperando como 20 segundos hasta que llamo al stop –

+0

Esta respuesta hace referencia a 'MediaPlayer' pero el OP pregunta por' MediaRecorder ' –

4

El problema no está en la parada, sino en el inicio. No comienza correctamente, es por eso que no puedes detenerlo más tarde.

Comprobar par de cosas: a) que agregó persmission android.permission.RECORD_AUDIO

b) Que se escribe en la tarjeta SD (no estoy seguro de que es requisito, pero creo que tenía un problema escrito al interno memoria). Necesitará permiso para escribir en la tarjeta SD.

c) Además, trate de establecer onErrorListener http://developer.android.com/reference/android/media/MediaPlayer.html#setOnErrorListener(android.media.MediaPlayer.OnErrorListener)

d) Trate de reset() MediaPlayer antes de ninguna otra llamada recomendaría para leer este artículo http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States MediaRecorder de Android Unidos es la pesadilla.

+0

todos los permisos están bien. Traté de cambiar a la tarjeta SD e hice un reinicio al comienzo del método startrecording. Ahora logcat me dice algo nuevo en .start(): 09-06 23: 34: 20.310: D/audio_input (123): DoStop: X 09-06 23: 34: 20.330: D/audio_input (123) : DoReset: E 09-06 23: 34: 20.340: D/audio_input (123): DoReset: X 09-06 23: 34: 20.340: E/audio_input (123): parámetro no soportada: x-pvmf/media-input-node/cap-config-interface; valtype = key_specific_value 09-06 23: 34: 20.340: E/audio_input (123): VerifyAndSetParameter failed –

Cuestiones relacionadas