Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Android Camera in Background?

I'm currently developing an app which need to record video in background and process it.

(It needs to get camera preview data real-time in background and have to image process the preview data)

However, to achieve it, I need to use Camera and OpenCV as Service, and it seems that it is impossible to use JavaCameraView in OpenCV and Android.Hardware.Camera without using any preview.

Here are my questions.

  1. I heard that NativeCamera in OpenCV can be used for this purpose. Is it possible? (Possibly with examples?)

  2. Is there any method that I can use JavaCameraView(or similar stuff) for this purpose? I currently use Galaxy S4.

  3. Is there any possible workarounds if android doesn't support such method?(Using Camera Preview without any surface view, or Process camera data without using preview)

  4. (OPTIONAL)Why the android doesn't support such operation? It is very annoying!

Thank you for answering the question.

like image 673
EngineerCat Avatar asked Oct 09 '13 21:10

EngineerCat


People also ask

How do you record camera with screen off?

Quick Video Recorder is a free Android app that not only allows you to record a video with the screen off, but you can also schedule a recording. To schedule a recording, tap on the clock tab and fill in the apps' information. For example, you'll need to fill in the: Date.


1 Answers

Yes it is possible with following steps..

Create one activity which will start your background service on some event or you can also use alarm manager to start and stop the service as per your requirement.

See the below code that'll help you.

public boolean starMediaRecording(){
        Camera.Parameters params = mServiceCamera.getParameters();
        mServiceCamera.setParameters(params);
        Camera.Parameters p = mServiceCamera.getParameters();

        final List<Size> listSize = p.getSupportedPreviewSizes();
        Size mPreviewSize = listSize.get(2);
        p.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
        p.setPreviewFormat(PixelFormat.YCbCr_420_SP);
        mServiceCamera.setParameters(p);

        try {
            mServiceCamera.setPreviewDisplay(mSurfaceHolder);
            mServiceCamera.startPreview();
        }
        catch (IOException e) {
            Log.e(TAG, e.getMessage());
            e.printStackTrace();
        }

        mServiceCamera.unlock();

        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.setCamera(mServiceCamera);
        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        mMediaRecorder.setOutputFile("/sdcard/filenamevideo.mp4");
        mMediaRecorder.setVideoFrameRate(30);
        mMediaRecorder.setVideoSize(mPreviewSize.width, mPreviewSize.height);
        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

        mMediaRecorder.prepare();
        mMediaRecorder.start(); 

        mRecordingStatus = true;

        return true;

}

public void stopMediaRecorder() {
    mServiceCamera.reconnect();

    mMediaRecorder.stop();
    mMediaRecorder.reset();

    mServiceCamera.stopPreview();
    mMediaRecorder.release();

    mServiceCamera.release();
    mServiceCamera = null;
    }
}
like image 97
Bhaumik Thakkar Avatar answered Oct 12 '22 06:10

Bhaumik Thakkar