Android Video Capture Tutorial

Tutorial for Capture video in android device.

AndroidVideoCapture.java

package com.exercise.AndroidVideoCapture;

import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Toast;

public class AndroidVideoCapture extends Activity{
   
    private Camera myCamera;
    private MyCameraSurfaceView myCameraSurfaceView;
    private MediaRecorder mediaRecorder;

    Button myButton;
    SurfaceHolder surfaceHolder;
    boolean recording;
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        recording = false;
       
        setContentView(R.layout.main);
       
        //Get Camera for preview
        myCamera = getCameraInstance();
        if(myCamera == null){
            Toast.makeText(AndroidVideoCapture.this,
                    "Fail to get Camera",
                    Toast.LENGTH_LONG).show();
        }

        myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
        FrameLayout myCameraPreview = (FrameLayout)findViewById(R.id.videoview);
        myCameraPreview.addView(myCameraSurfaceView);
       
        myButton = (Button)findViewById(R.id.mybutton);
        myButton.setOnClickListener(myButtonOnClickListener);
    }
   
    Button.OnClickListener myButtonOnClickListener
    = new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(recording){
                // stop recording and release camera
                mediaRecorder.stop();  // stop the recording
                releaseMediaRecorder(); // release the MediaRecorder object
               
                //Exit after saved
                finish();
            }else{
               
                //Release Camera before MediaRecorder start
                releaseCamera();
               
                if(!prepareMediaRecorder()){
                    Toast.makeText(AndroidVideoCapture.this,
                            "Fail in prepareMediaRecorder()!\n - Ended -",
                            Toast.LENGTH_LONG).show();
                    finish();
                }
               
                mediaRecorder.start();
                recording = true;
                myButton.setText("STOP");
            }
        }};
   
    private Camera getCameraInstance(){
        // TODO Auto-generated method stub
        Camera c = null;
        try {
            c = Camera.open(); // attempt to get a Camera instance
        }
        catch (Exception e){
            // Camera is not available (in use or does not exist)
        }
        return c; // returns null if camera is unavailable
    }
   
    private boolean prepareMediaRecorder(){
        myCamera = getCameraInstance();
        mediaRecorder = new MediaRecorder();

        myCamera.unlock();
        mediaRecorder.setCamera(myCamera);

        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

        mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
        mediaRecorder.setMaxDuration(60000); // Set max duration 60 sec.
        mediaRecorder.setMaxFileSize(5000000); // Set max file size 5M

        mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder().getSurface());

        try {
            mediaRecorder.prepare();
        } catch (IllegalStateException e) {
            releaseMediaRecorder();
            return false;
        } catch (IOException e) {
            releaseMediaRecorder();
            return false;
        }
        return true;
       
    }
   
    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaRecorder();       // if you are using MediaRecorder, release it first
        releaseCamera();              // release the camera immediately on pause event
    }

    private void releaseMediaRecorder(){
        if (mediaRecorder != null) {
            mediaRecorder.reset();   // clear recorder configuration
            mediaRecorder.release(); // release the recorder object
            mediaRecorder = null;
            myCamera.lock();           // lock camera for later use
        }
    }

    private void releaseCamera(){
        if (myCamera != null){
            myCamera.release();        // release the camera for other applications
            myCamera = null;
        }
    }
   
    public class MyCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{

        private SurfaceHolder mHolder;
        private Camera mCamera;
       
        public MyCameraSurfaceView(Context context, Camera camera) {
            super(context);
            mCamera = camera;

            // Install a SurfaceHolder.Callback so we get notified when the
            // underlying surface is created and destroyed.
            mHolder = getHolder();
            mHolder.addCallback(this);
            // deprecated setting, but required on Android versions prior to 3.0
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int weight,
                int height) {
            // If your preview can change or rotate, take care of those events here.
            // Make sure to stop the preview before resizing or reformatting it.

            if (mHolder.getSurface() == null){
              // preview surface does not exist
              return;
            }

            // stop preview before making changes
            try {
                mCamera.stopPreview();
            } catch (Exception e){
              // ignore: tried to stop a non-existent preview
            }

            // make any resize, rotate or reformatting changes here

            // start preview with new settings
            try {
                mCamera.setPreviewDisplay(mHolder);
                mCamera.startPreview();

            } catch (Exception e){
            }
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            // The Surface has been created, now tell the camera where to draw the preview.
            try {
                mCamera.setPreviewDisplay(holder);
                mCamera.startPreview();
            } catch (IOException e) {
            }
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
           
        }
    }
}



main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <RelativeLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <FrameLayout
            android:id="@+id/videoview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>
        <Button
            android:id="@+id/mybutton"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_centerHorizontal="true"
            android:layout_alignParentBottom="true"
            android:text="REC"
            android:textSize="12dp"/>
    </RelativeLayout>
</LinearLayout>



AndroidManifest.xml  

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.exercise.AndroidVideoCapture"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
    <uses-permission android:name="android.permission.CAMERA"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AndroidVideoCapture"
                  android:label="@string/app_name"
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>
 




 

click here to Download.


Comments

  1. this is the first quality code for video recording...
    good

    ReplyDelete
  2. Thanks a lot!! You saved my life!
    I just have a little problem: the video is in the wrong orientation, any idea why?

    ReplyDelete
    Replies
    1. camera.setDisplayOrientation(90);

      Delete
    2. Unknown...i set camera.setDisplayOrientation(90);
      but still i m getting an Wrong way....

      Delete
    3. My Mean...All are Good...and i want to Portait mode video thats also done By your abouve Line.....but Video View is not good..plz help me if u know...):

      Delete
  3. Add this line after camera open
    c.setDisplayOrientation(90);

    Add this line after set preview display

    mediaRecorder.setOrientationHint(90);

    ReplyDelete
  4. its very good example but i need to take picture and
    add functionality of flash and camera front/back...please help me.

    ReplyDelete
  5. This is an awesome base of code. Thank you very much!

    ReplyDelete
  6. Hi, I'm tryin to record video with this example, it works fine but file created have only 2 seconds of video. Facing this all time.
    Do you know what can be happening? I'm on Xperia ZL with 4.4.2 android.
    Thanks a lot

    ReplyDelete
  7. Hi,
    Thanks for tutorial but i am getting Null pointer on // start preview with new settings
    try {
    mCamera.setPreviewDisplay(mHolder);
    mCamera.startPreview();

    } catch (Exception e){
    }

    ReplyDelete
  8. This is the only example that actually works, Thank you!

    ReplyDelete
  9. This is the only example that actually works, Thank you!

    ReplyDelete
  10. Thanks a TON !!!!!!!!!!!!!!!!!

    ReplyDelete
  11. FINALLY A TUTORIAL THAT WORKS!!!!!

    ReplyDelete
  12. Thank you for posting this! The download link is busted as of today (2015-0909), but I was able to use the code to create a working demo in android studio 1.3.1 without too much trouble.

    ReplyDelete
  13. java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.setPreviewDisplay(android.view.SurfaceHolder)' on a null object reference
    11-09 22:56:24.438 21574-21574/com.example.antonio.videotest E/AndroidRuntime: at com.example.antonio.videotest.CameraPreview.surfaceCreated(CameraPreview.java:65)

    ReplyDelete
  14. It works!! but where is the stored video?? how to play it?

    ReplyDelete
  15. Nice Tutorial....
    i want to set CameraMode in Portrait ...plz Help me

    ReplyDelete
  16. how can i change the whole in portrait .

    ReplyDelete
  17. Hey there Mr. Sandy,
    Your tutorials are fantastic! They really taught me a lot.

    However, I am having some troubles with a couple of things:
    > Creating controls (like flash mode toggle, switch between back/front camera etc).
    > In saving the video in internal memory after the camera is done with the recording.

    Some help would be greatly appreciated.

    Thanks a lot!

    ReplyDelete

Post a Comment

Popular posts from this blog

Horizontal ListView Tutorial

Analog Clock Widget Tutorial