2012-09-06 33 views
5

Sto cercando di sviluppare un semplice registratore audio Android. Tutto funziona bene e funziona anche bene sul dispositivo Android. Sembra che posso iniziare la registrazione, ma quando voglio fermarlo lancia un IllegalStateException. Non riesco a trovare l'errore. Ecco il codice:android - MediaRecorder lancia illegittimaescrizione

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

voglio innescare con:

VoiceRecorder vr = new VoiceRecorder();

vr.startRecord (cont);

vr.stopRecording (seguito);

al momento della chiamata inizia Logcat dice: (quello che dovrebbe essere ok)

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 

Ma quando lo chiamo arresto:

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) 

risposta

2

Sembra che l'errore viene generata quando si chiama stop() da uno stato non valido.

Il ciclo di attività per il registratore sembra anche indicare il necessario per preparare() prima di poter iniziare la registrazione - stai facendo questo? stop() non è un comando valido a meno che il registratore non sia almeno preparato.

Se siete, forse ci vuole un attimo per il registratore di stabilirsi in realtà in uno stato valido prima di poter poi richiamare stop(). Lo chiami immediatamente dopo l'avvio(), quindi forse qualcosa sta accadendo lì.

+1

Non è consentito pubblicare più di due collegamenti ipertestuali. Qualche ulteriore lettura: - http://stackoverflow.com/questions/11852852/stop-called-in-an-invalid-state-1 - http: //www.benmccann.com/dev-blog/android-audio-recording-tutorial/ – TheMaster42

+0

hmm ho chiamato la preparazione prima di iniziare e aspetto 20sec fino a quando non chiamo lo stop –

+0

Questa risposta fa riferimento a 'MediaPlayer' ma l'OP sta chiedendo di' MediaRecorder ' –

4

Il problema non è in stop, ma in partenza. Non inizia correttamente, ecco perché non puoi fermarlo più tardi.

Controllare paio di cose: a) che si è aggiunto persmission android.permission.RECORD_AUDIO

b) che si scrive sulla scheda SD (non sono sicuro che sia requisito, ma credo che ho avuto problema di scrittura interna memoria). Avrai bisogno dell'autorizzazione per scrivere su scheda SD.

c) Inoltre, cercare di impostare onErrorListener http://developer.android.com/reference/android/media/MediaPlayer.html#setOnErrorListener(android.media.MediaPlayer.OnErrorListener)

d) Cercare di reset() MediaPlayer prima di qualsiasi altra chiamata mi sento di raccomandare a leggere questo articolo http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States MediaRecorder di Android afferma è l'incubo.

+0

tutte le autorizzazioni sono ok. Ho provato a passare alla scheda SD e ho fatto un reset all'inizio del metodo Startrecording. Ora logcat mi dice sth new su .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): parametro supportato: x-pvmf/media-input-node/cap-config-interface; valtype = key_specific_value 09-06 23: 34: 20.340: E/audio_input (123): VerifyAndSetParameter non riuscito –