Search code examples
androidvideocamerarecording

Android prepare videoRecorder stops preview


so I have a camera app that I also want to record videos. when I push a button to switch from camera to video i do this

public void prepareVideoRecorder() {
    mCamera.stopPreview();
    mCamera.prepareRecorder(video_orientation, camera_surface);
    // mCamera.startPreview();

}

and my prepare method

public void prepareRecorder(int video_degrees, CameraSurfaceView sf) {
    CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);

    recorder = new MediaRecorder();
    mCamera.unlock();
    recorder.setCamera(mCamera);
    recorder.setPreviewDisplay(sf.getHolder().getSurface());

    Log.v("this", "orientation hint = " + video_degrees);
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    recorder.setOrientationHint(video_degrees);

    File imageFileFolder = new File(Environment.getExternalStorageDirectory(), "DCIM");
    String filename = imageFileFolder.toString() + "/" + new SimpleDateFormat("ddMMyyyyHHmmss").format(new Date()) + ".mp4";
    recorder.setOutputFile(filename);

    recorder.setProfile(camcorderProfile);
    try {
        recorder.prepare();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

when i push the "switch" button the preview stops. But if i push the start recording button, everything works good, i can record the video and also the preview starts again. If i try to uncomment the mCamera.startPreview() from prepareVideoRecorder i get this error

    02-24 13:44:49.146: E/InputEventReceiver(18078): Exception dispatching input event.
02-24 13:44:49.146: E/MessageQueue-JNI(18078): Exception in MessageQueue callback: handleReceiveCallback
02-24 13:44:49.146: E/MessageQueue-JNI(18078): java.lang.RuntimeException: startPreview failed
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.hardware.Camera.startPreview(Native Method)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at org.dtaz.yoda.DtazCamera.startPreview(DtazCamera.java:136)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at org.dtaz.yoda.DtazPreview.prepareVideoRecorder(DtazPreview.java:343)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at org.dtaz.yoda.CameraActivity.swipeGesture(CameraActivity.java:600)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at org.dtaz.yoda.CameraSurfaceView.onTouchEvent(CameraSurfaceView.java:87)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.View.dispatchTouchEvent(View.java:7706)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2333)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.app.Activity.dispatchTouchEvent(Activity.java:2468)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2281)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.View.dispatchPointerEvent(View.java:7886)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.os.MessageQueue.nativePollOnce(Native Method)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.os.MessageQueue.next(MessageQueue.java:138)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.os.Looper.loop(Looper.java:123)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.app.ActivityThread.main(ActivityThread.java:5034)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at java.lang.reflect.Method.invokeNative(Native Method)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at java.lang.reflect.Method.invoke(Method.java:515)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at dalvik.system.NativeStart.main(Native Method)
02-24 13:44:49.156: D/AndroidRuntime(18078): Shutting down VM
02-24 13:44:49.156: W/dalvikvm(18078): threadid=1: thread exiting with uncaught exception (group=0x41841c08)
02-24 13:44:49.166: E/AndroidRuntime(18078): FATAL EXCEPTION: main
02-24 13:44:49.166: E/AndroidRuntime(18078): Process: org.dtaz.yoda, PID: 18078
02-24 13:44:49.166: E/AndroidRuntime(18078): java.lang.RuntimeException: startPreview failed
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.hardware.Camera.startPreview(Native Method)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at org.dtaz.yoda.DtazCamera.startPreview(DtazCamera.java:136)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at org.dtaz.yoda.DtazPreview.prepareVideoRecorder(DtazPreview.java:343)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at org.dtaz.yoda.CameraActivity.swipeGesture(CameraActivity.java:600)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at org.dtaz.yoda.CameraSurfaceView.onTouchEvent(CameraSurfaceView.java:87)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.View.dispatchTouchEvent(View.java:7706)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2333)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.app.Activity.dispatchTouchEvent(Activity.java:2468)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2281)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.View.dispatchPointerEvent(View.java:7886)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.os.MessageQueue.nativePollOnce(Native Method)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.os.MessageQueue.next(MessageQueue.java:138)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.os.Looper.loop(Looper.java:123)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.app.ActivityThread.main(ActivityThread.java:5034)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at java.lang.reflect.Method.invokeNative(Native Method)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at java.lang.reflect.Method.invoke(Method.java:515)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at dalvik.system.NativeStart.main(Native Method)

anyone know what is going on?


Solution

  • ok so I came up with a solution, i don't know if it is the right one but it works.

    The case is that in order to record video the camera instance needs to be acquired by the MediaRecorder and simultaneously if you want to show preview , the camera instance needs to be in the surfaceview. That's why if you start the recording you can see the image been captured.

    so the only way to overcome this is to put the prepare inside the onclick method just before the mediarecorder.start() like this.

    take_picture.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                if (isVideo) {
                    if (!isRecording) {
                        camera_preview.prepareVideoRecorder();
                        camera_preview.startRecording();
                        take_picture.setText("stop");
                        isRecording = true;
                    } else {
                        camera_preview.stopRecording();
                        take_picture.setText("start");
                        isRecording = false;
                    }
                } 
            }
        }); 
    

    If you put the code like this, everything works good. If anyone has a better solution please post it so we can use it!!!