2012-09-06 4 views
5

Je suis en train de développer un enregistreur audio Android simple. Tout se construit bien et il fonctionne aussi bien sur l'appareil Android. Il semble que je puisse commencer l'enregistrement mais quand je veux l'arrêter, il lance une exception IllegalStateException. Je ne peux pas trouver l'erreur. Voici le code:android - MediaRecorder jette 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; 
} 
} 

Je veux déclencher avec:

VoiceRecorder vr = new VoiceRecorder();

vr.startRecord (suite);

vr.stopRecording (suite);

lors de l'appel départ Logcat dit: (ce qui devrait être 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 

Mais quand je l'appelle arrêt:

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) 

Répondre

2

On dirait que cette erreur est levée lorsque vous appelez stop() de un état invalide.

Le cycle d'activité de l'enregistreur semble également indiquer que vous devez préparer() avant de pouvoir commencer l'enregistrement - faites-vous cela? stop() n'est pas une commande valide à moins que l'enregistreur ne soit au moins préparé.

Si vous êtes, peut-être il prend un moment pour l'enregistreur de régler effectivement dans un état valide avant de pouvoir appeler plus tard arrêt(). Vous l'appelez immédiatement après start() alors peut-être que quelque chose se passe là-bas.

+1

Vous n'êtes pas autorisé à publier plus de deux hyperliens. Quelques lectures supplémentaires: - http://stackoverflow.com/questions/11852852/stop-appelé-in-an-invalid-state-1 - http: //www.benmccann.com/dev-blog/android-audio-enregistrement-tutoriel/ – TheMaster42

+0

hmm j'ai appelé le préparer avant de commencer et j'attends comme 20sec jusqu'à ce que j'appelle l'arrêt –

+0

Cette réponse fait référence 'MediaPlayer' mais l'OP pose des questions sur' MediaRecorder ' –

4

Le problème n'est pas en arrêt, mais en début. Il ne démarre pas correctement, c'est pourquoi vous ne pouvez pas l'arrêter plus tard.

Vérifiez deux choses: a) que vous avez ajouté persmission android.permission.RECORD_AUDIO

b) que vous écrivez sur la carte SD (je ne suis pas sûr qu'il est nécessaire, mais je crois que j'avais problème à écrire interne Mémoire). Vous aurez besoin de la permission d'écrire sur la carte SD.

c) Aussi, essayez de mettre onErrorListener http://developer.android.com/reference/android/media/MediaPlayer.html#setOnErrorListener(android.media.MediaPlayer.OnErrorListener)

d) Essayez de réinitialiser() MediaPlayer avant tout autre appel Je recommande de lire cet article http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States déclare MediaRecorder de Android est le cauchemar.

+0

toutes les autorisations sont correctes. J'ai essayé de changer en carte SD et fait une réinitialisation au début de la méthode startrecording. Maintenant, logcat me dit sth nouveau sur .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 6/9 23: 34: 20,340: D/audio_input (123): DoReset: X 6/9 23: 34: 20,340: E/audio_input (123): paramètre non pris en charge: x-PVMF/media-input-node/cap-config-interface; valtype = valeur_spécifique_clé 09-06 23: 34: 20.340: E/audio_input (123): échec de VerifyAndSetParameter –

Questions connexes