MediaRecorder falló cuando detengo la grabación

Tengo este error. ¿Alguien puede ayudarme por favor, creo que es algo acerca del oyente táctil … El error está ocurriendo cuando suelto mi dedo.

04-25 20:07:00.263: D/FB Sessions(18429): false 04-25 20:07:04.533: I/MediaRecorderJNI(18429): prepare: surface=0x189250 (identity=1813) 04-25 20:07:10.493: E/MediaRecorder(18429): stop failed: -1007 04-25 20:07:10.493: D/AndroidRuntime(18429): Shutting down VM 04-25 20:07:10.493: W/dalvikvm(18429): threadid=1: thread exiting with uncaught exception (group=0x40018608) 04-25 20:07:10.503: E/AndroidRuntime(18429): FATAL EXCEPTION: main 04-25 20:07:10.503: E/AndroidRuntime(18429): java.lang.RuntimeException: stop failed. 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.media.MediaRecorder.stop(Native Method) 04-25 20:07:10.503: E/AndroidRuntime(18429): at com.crewbase.rec.RecordActivity.stopRecording(RecordActivity.java:151) 04-25 20:07:10.503: E/AndroidRuntime(18429): at com.crewbase.rec.RecordActivity.access$2(RecordActivity.java:150) 04-25 20:07:10.503: E/AndroidRuntime(18429): at com.crewbase.rec.RecordActivity$1.onTouch(RecordActivity.java:79) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.view.View.dispatchTouchEvent(View.java:3897) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942) 04-25 20:07:10.503: E/AndroidRuntime(18429): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1737) 04-25 20:07:10.503: E/AndroidRuntime(18429): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1153) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 04-25 20:07:10.503: E/AndroidRuntime(18429): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1721) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2200) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.view.ViewRoot.handleMessage(ViewRoot.java:1884) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.os.Handler.dispatchMessage(Handler.java:99) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.os.Looper.loop(Looper.java:130) 04-25 20:07:10.503: E/AndroidRuntime(18429): at android.app.ActivityThread.main(ActivityThread.java:3835) 04-25 20:07:10.503: E/AndroidRuntime(18429): at java.lang.reflect.Method.invokeNative(Native Method) 04-25 20:07:10.503: E/AndroidRuntime(18429): at java.lang.reflect.Method.invoke(Method.java:507) 04-25 20:07:10.503: E/AndroidRuntime(18429): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 04-25 20:07:10.503: E/AndroidRuntime(18429): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 04-25 20:07:10.503: E/AndroidRuntime(18429): at dalvik.system.NativeStart.main(Native Method) 

Y eso está sucediendo cuando intento ejecutar este código:

Desde el oyente táctil:

 /// Preview is SurfaceView in my view preview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: prepareRecording(); break; case MotionEvent.ACTION_MOVE: //Log.d(TAG, String.format("ACTION_MOVE | x:%sy:%s", break; case MotionEvent.ACTION_UP: stopRecording(); break; } return true; } }); 

Y estos dos métodos:

 private void prepareRecording() { try { camera.unlock(); recorder = new MediaRecorder(); recorder.setCamera(camera); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); File tempFile = new File(Environment.getExternalStorageDirectory(), "/rec/temp/video_" + String.valueOf(videoCount) + ".mp4"); recorder.setOutputFile(tempFile.getPath()); recorder.setVideoFrameRate(25); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); recorder.setPreviewDisplay(holder.getSurface()); recorder.prepare(); recorder.start(); } catch (IllegalStateException e) { Log.e("REDORDING :: ",e.getMessage()); e.printStackTrace(); } catch (IOException e) { Log.e("REDORDING :: ",e.getMessage()); e.printStackTrace(); } } private void stopRecording() { recorder.stop(); camera.lock(); } 

Mira la documentación :

Tenga en cuenta que una RuntimeException se lanzará intencionalmente a la aplicación, si no se ha recibido ningún dato válido de audio / vídeo cuando se llama a stop (). Esto sucede si stop () se llama inmediatamente después de start (). El fallo permite que la aplicación tome acción en consecuencia para limpiar el archivo de salida (eliminar el archivo de salida, por ejemplo), ya que el archivo de salida no se construye correctamente cuando esto sucede.

En otras palabras: Dalvik lanza la excepción a propósito. Tienes que manejarlo para limpiar después de tu aplicación. Tendrías que manejarlo así:

 private void stopRecording() { try{ recorder.stop(); }catch(RuntimeException stopException){ //handle cleanup here } camera.lock(); } 
  • Cómo grabar vídeo en Android en Stream
  • Capturar vídeo con proporción de aspecto 1: 1 en Android
  • Android MediaRecorder en streaming
  • Android getSupportedVideoSizes siempre devuelve null
  • Cómo saber cuando MediaRecorder ha terminado de escribir datos en el archivo
  • ¿Cómo saber si un MediaRecorder está en estado de ejecución o no?
  • MediaRecorder "falló -12"
  • Android MediaRecorder: Sobreescritura continua
  • MediaRecorder.stop () se cuelga en la cámara Samsung Galaxy
  • ¿Por qué Camera necesita ser lanzado en onPause () en lugar de onstop () método de Activity?
  • La clase MediaRecorder comienza a grabar audio después de un ligero retraso
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.