2013-04-25 3 views
25

У меня есть эта ошибка. Может кто-нибудь, пожалуйста, помогите мне, я думаю, что это что-то касательно слушателя ... Ошибка происходит, когда я отпускаю палец.Ошибка MediaRecorder при остановке записи

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) 

И что происходит, когда я пытаюсь запустить этот код:

от прикосновения слушателя:

/// 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:%s y:%s", 
       break; 
      case MotionEvent.ACTION_UP: 
       stopRecording(); 
       break; 
      } 
      return true; 
     } 
    }); 

И эти два метода:

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

ответ

45

Посмотрите на documentation :

Обратите внимание, что исключение RuntimeException намеренно бросается в приложение , если не было получено достоверных аудио/видеоданных при вызове stop(). Это происходит, если stop() вызывается сразу после start(). Неисправность позволяет приложению принять меры, соответствующие , очистить выходной файл (например, удалить выходной файл), так как выходной файл некорректно сконструирован, когда это произойдет.

Другими словами: Dalvik специально выбрасывает исключение. Вы должны обработать его для очистки после своего приложения. Вы должны были бы справиться с этим, как это:

private void stopRecording() { 
    try{ 
     recorder.stop(); 
    }catch(RuntimeException stopException){ 
     //handle cleanup here 
    } 
    camera.lock(); 
} 
+0

есть ли другой способ сделать это? –

+0

в моем случае это не немедленный старт/остановка, или медиапреследование с помощью mediarecorder просто не работает? https://stackoverflow.com/a/34986043/4548520 Я не могу понять, почему эта проблема возникает, когда я останавливаю запись на экране – user25

0

У меня была подобная ошибка -1007, когда я записывал звук с AMR_WB, но оказалось, что проблема заключалась в том, что я забыл установить частоту дискретизации.

mediaRecorder.setAudioSamplingRate(16000); 
Смежные вопросы