1. add below three permission into AndroidManifest.xml file
- <uses-permission android:name= "android.permission.CAMERA" />
- <uses-permission android:name= "android.permission.RECORD_AUDIO" />
- <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />
2. get a camera instance
- /** A safe way to get an instance of the Camera object. */
- public static Camera getCameraInstance(){
- 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
- }
- public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
- private SurfaceHolder mHolder;
- private Camera mCamera;
- String TAG="CAMERAAPI";
- public CameraPreview(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);
- }
- public void surfaceCreated(SurfaceHolder holder) {
- // The Surface has been created, now tell the camera where to draw the preview.
- try {
- mCamera.setPreviewDisplay(holder);
- mCamera.startPreview();
- } catch (IOException e) {
- Log. d(TAG, "Error setting camera preview: " + e.getMessage());
- }
- }
- public void surfaceDestroyed(SurfaceHolder holder) {
- // empty. Take care of releasing the Camera preview in your activity.
- }
- public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
- // 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
- }
- // set preview size and make any resize, rotate or
- // reformatting changes here
- // start preview with new settings
- try {
- mCamera.setPreviewDisplay( mHolder);
- mCamera.startPreview();
- } catch (Exception e){
- Log. d(TAG, "Error starting camera preview: " + e.getMessage());
- }
- }
- }
- private boolean prepareVideoRecorder(){
- mCamera = getCameraInstance();
- mMediaRecorder = new MediaRecorder();
- // Step 1: Unlock and set camera to MediaRecorder
- mCamera.unlock();
- mMediaRecorder.setCamera(mCamera );
- // Step 2: Set sources
- mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
- mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
- // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
- mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile. QUALITY_HIGH));
- // Step 4: Set output file
- mMediaRecorder.setOutputFile(getOutputMediaFile( MEDIA_TYPE_VIDEO).toString());
- // Step 5: Set the preview output
- mMediaRecorder.setPreviewDisplay(mPreview .getHolder().getSurface());
- // Step 6: Prepare configured MediaRecorder
- try {
- mMediaRecorder.prepare();
- } catch (IllegalStateException e) {
- Log. d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
- releaseMediaRecorder();
- return false ;
- } catch (IOException e) {
- Log. d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
- releaseMediaRecorder();
- return false ;
- }
- return true ;
- }
- public class MediaRecorderActivity extends Activity {
- public static final int MEDIA_TYPE_IMAGE = 1;
- public static final int MEDIA_TYPE_VIDEO = 2;
- private Camera mCamera;
- private CameraPreview mPreview;
- private MediaRecorder mMediaRecorder;
- String TAG="CAMERAAPI";
- boolean isRecording=false ;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout. main);
- mCamera = getCameraInstance();
- // // Create our Preview view and set it as the content of our activity.
- mPreview = new CameraPreview(this, mCamera);
- FrameLayout preview = (FrameLayout) findViewById(R.id. camera_preview);
- preview.addView( mPreview);
- Button captureButton = (Button) findViewById(id. button_capture);
- captureButton.setOnClickListener( new CaptureButtonOnClickListener());
- }
- public class CaptureButtonOnClickListener implements View.OnClickListener{
- public void onClick(View v) {
- Button captureButton = (Button)v;
- if (isRecording ) {
- // stop recording and release camera
- mMediaRecorder.stop(); // stop the recording
- releaseMediaRecorder(); // release the MediaRecorder object
- mCamera.lock(); // take camera access back from MediaRecorder
- // inform the user that recording has stopped
- captureButton.setText( "Capture");
- isRecording = false ;
- } else {
- try{
- // initialize video camera
- if (prepareVideoRecorder()) {
- // Camera is available and unlocked, MediaRecorder is prepared,
- // now you can start recording
- mMediaRecorder.start();
- // inform the user that recording has started
- captureButton.setText( "Stop");
- isRecording = true ;
- } else {
- // prepare didn't work, release the camera
- releaseMediaRecorder();
- // inform user
- }
- } catch(Exception ex){
- System. out.println(ex.toString());
- ex.printStackTrace();
- }
- }
- }
- }
- /** A safe way to get an instance of the Camera object. */
- public static Camera getCameraInstance(){
- 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
- }
- /** Create a File for saving an p_w_picpath or video */
- private static File getOutputMediaFile(int type){
- // To be safe, you should check that the SDCard is mounted
- // using Environment.getExternalStorageState() before doing this.
- File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
- Environment. DIRECTORY_PICTURES), "MyCameraApp" );
- // This location works best if you want the created p_w_picpaths to be shared
- // between applications and persist after your app has been uninstalled.
- // Create the storage directory if it does not exist
- if (! mediaStorageDir.exists()){
- if (! mediaStorageDir.mkdirs()){
- Log. d("MyCameraApp", "failed to create directory");
- return null ;
- }
- }
- // Create a media file name
- String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss" ).format(new Date());
- File mediaFile;
- if (type == MEDIA_TYPE_IMAGE){
- mediaFile = new File(mediaStorageDir.getPath() + File.separator +
- "IMG_"+ timeStamp + ".jpg" );
- } else if (type == MEDIA_TYPE_VIDEO) {
- mediaFile = new File(mediaStorageDir.getPath() + File.separator +
- "VID_"+ timeStamp + ".mp4" );
- } else {
- return null ;
- }
- return mediaFile;
- }
- @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 releaseCamera(){
- if (mCamera != null){
- mCamera.release(); // release the camera for other applications
- mCamera = null;
- }
- }
- private void releaseMediaRecorder(){
- if (mMediaRecorder != null) {
- mMediaRecorder.reset(); // clear recorder configuration
- mMediaRecorder.release(); // release the recorder object
- mMediaRecorder = null ;
- mCamera.lock(); // lock camera for later use
- }
- }
- }