本文出自 “whithin's” 博客,请务必保留此出处http://whithin.blog.51cto.com/690417/1063573


1. add  below three permission into AndroidManifest.xml file


  
  1. <uses-permissionandroid:name= "android.permission.CAMERA"/>

  2. <uses-permissionandroid:name= "android.permission.RECORD_AUDIO"/>

  3. <uses-permissionandroid:name= "android.permission.WRITE_EXTERNAL_STORAGE"/>

2. get a camera instance


  
  1. /** A safe way to get an instance of the Camera object. */

  2. publicstatic Camera getCameraInstance(){

  3.    Camera c = null;

  4. try {

  5.        c = Camera. open(); // attempt to get a Camera instance

  6.    }

  7. catch (Exception e){

  8. // Camera is not available (in use or does not exist)

  9.    }

  10. return c; // returns null if camera is unavailable

  11. }  


3. implement a preview for the user to preview the live p_w_picpath for the camera

   
  1. publicclass CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

  2. private SurfaceHolder mHolder;

  3. private Camera mCamera;

  4.    String TAG="CAMERAAPI";

  5. public CameraPreview(Context context, Camera camera) {

  6. super(context);

  7.        mCamera = camera;

  8. // Install a SurfaceHolder.Callback so we get notified when the

  9. // underlying surface is created and destroyed.

  10.        mHolder = getHolder();

  11.        mHolder.addCallback( this);

  12. // deprecated setting, but required on Android versions prior to 3.0

  13.        mHolder. setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  14.    }

  15. publicvoid surfaceCreated(SurfaceHolder holder) {

  16. // The Surface has been created, now tell the camera where to draw the preview.

  17. try {

  18.            mCamera.setPreviewDisplay(holder);

  19.            mCamera.startPreview();

  20.        } catch (IOException e) {

  21.            Log. d(TAG, "Error setting camera preview: " + e.getMessage());

  22.        }

  23.    }

  24. publicvoid surfaceDestroyed(SurfaceHolder holder) {

  25. // empty. Take care of releasing the Camera preview in your activity.

  26.    }

  27. publicvoid surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

  28. // If your preview can change or rotate, take care of those events here.

  29. // Make sure to stop the preview before resizing or reformatting it.

  30. if (mHolder .getSurface() == null){

  31. // preview surface does not exist

  32. return;

  33.        }

  34. // stop preview before making changes

  35. try {

  36.            mCamera.stopPreview();

  37.        } catch (Exception e){

  38. // ignore: tried to stop a non-existent preview

  39.        }

  40. // set preview size and make any resize, rotate or

  41. // reformatting changes here

  42. // start preview with new settings

  43. try {

  44.            mCamera.setPreviewDisplay( mHolder);

  45.            mCamera.startPreview();

  46.        } catch (Exception e){

  47.            Log. d(TAG, "Error starting camera preview: " + e.getMessage());

  48.        }

  49.    }

  50. }

4.initialize MediaRecorder for video recording

   
  1. privateboolean prepareVideoRecorder(){

  2.    mCamera = getCameraInstance();

  3.    mMediaRecorder = new MediaRecorder();

  4. // Step 1: Unlock and set camera to MediaRecorder

  5.    mCamera.unlock();

  6.    mMediaRecorder.setCamera(mCamera );

  7. // Step 2: Set sources

  8.    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

  9.    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

  10. // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)

  11.    mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile. QUALITY_HIGH));

  12. // Step 4: Set output file

  13.    mMediaRecorder.setOutputFile(getOutputMediaFile( MEDIA_TYPE_VIDEO).toString());

  14. // Step 5: Set the preview output

  15.    mMediaRecorder.setPreviewDisplay(mPreview .getHolder().getSurface());

  16. // Step 6: Prepare configured MediaRecorder

  17. try {

  18.        mMediaRecorder.prepare();

  19.    } catch (IllegalStateException e) {

  20.        Log. d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());

  21.        releaseMediaRecorder();

  22. returnfalse ;

  23.    } catch (IOException e) {

  24.        Log. d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());

  25.        releaseMediaRecorder();

  26. returnfalse ;

  27.    }

  28. returntrue ;

  29. }


5.listen for the user operation to start or stop recording, the complete code for MediaRecorder is as below,remember to release the camera and MediaRecord when finished using it.

  
  1. publicclass MediaRecorderActivity extends Activity {

  2. publicstaticfinalint MEDIA_TYPE_IMAGE = 1;

  3. publicstaticfinalint MEDIA_TYPE_VIDEO = 2;

  4. private Camera mCamera;

  5. private CameraPreview mPreview;

  6. private MediaRecorder mMediaRecorder;

  7.    String TAG="CAMERAAPI";

  8. boolean isRecording=false ;

  9. @Override

  10. publicvoid onCreate(Bundle savedInstanceState) {

  11. super.onCreate(savedInstanceState);

  12.        setContentView(R.layout. main);

  13.        mCamera = getCameraInstance();

  14. //        // Create our Preview view and set it as the content of our activity.

  15.        mPreview = new CameraPreview(this, mCamera);

  16.        FrameLayout preview = (FrameLayout) findViewById(R.id. camera_preview);

  17.        preview.addView( mPreview);

  18.        Button captureButton = (Button) findViewById(id. button_capture);

  19.        captureButton.setOnClickListener( new CaptureButtonOnClickListener());

  20.    }

  21. publicclass CaptureButtonOnClickListener implements View.OnClickListener{

  22. publicvoid onClick(View v) {

  23.              Button captureButton = (Button)v;

  24. if (isRecording ) {

  25. // stop recording and release camera

  26.                mMediaRecorder.stop();  // stop the recording

  27.                releaseMediaRecorder(); // release the MediaRecorder object

  28.                mCamera.lock();         // take camera access back from MediaRecorder

  29. // inform the user that recording has stopped

  30.                captureButton.setText( "Capture");

  31.                isRecording = false ;

  32.            } else {

  33. try{

  34. // initialize video camera

  35. if (prepareVideoRecorder()) {

  36. // Camera is available and unlocked, MediaRecorder is prepared,

  37. // now you can start recording

  38.                    mMediaRecorder.start();

  39. // inform the user that recording has started

  40.                    captureButton.setText( "Stop");

  41.                    isRecording = true ;

  42.                } else {

  43. // prepare didn't work, release the camera

  44.                    releaseMediaRecorder();

  45. // inform user

  46.                }

  47.              } catch(Exception ex){

  48.                     System. out.println(ex.toString());

  49.                     ex.printStackTrace();

  50.              }

  51.            }

  52.        }      

  53.    }

  54. /** A safe way to get an instance of the Camera object. */

  55. publicstatic Camera getCameraInstance(){

  56.        Camera c = null;

  57. try {

  58.            c = Camera. open(); // attempt to get a Camera instance

  59.        }

  60. catch (Exception e){

  61. // Camera is not available (in use or does not exist)

  62.        }

  63. return c; // returns null if camera is unavailable

  64.    }

  65. /** Create a File for saving an p_w_picpath or video */

  66. privatestatic File getOutputMediaFile(int type){

  67. // To be safe, you should check that the SDCard is mounted

  68. // using Environment.getExternalStorageState() before doing this.

  69.           File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(

  70.                     Environment. DIRECTORY_PICTURES), "MyCameraApp" );

  71. // This location works best if you want the created p_w_picpaths to be shared

  72. // between applications and persist after your app has been uninstalled.

  73. // Create the storage directory if it does not exist

  74. if (! mediaStorageDir.exists()){

  75. if (! mediaStorageDir.mkdirs()){

  76.                   Log. d("MyCameraApp", "failed to create directory");

  77. returnnull ;

  78.               }

  79.           }

  80. // Create a media file name

  81.           String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss" ).format(new Date());

  82.           File mediaFile;

  83. if (type == MEDIA_TYPE_IMAGE){

  84.               mediaFile = new File(mediaStorageDir.getPath() + File.separator +

  85. "IMG_"+ timeStamp + ".jpg" );

  86.           } elseif (type == MEDIA_TYPE_VIDEO) {

  87.               mediaFile = new File(mediaStorageDir.getPath() + File.separator +

  88. "VID_"+ timeStamp + ".mp4" );

  89.           } else {

  90. returnnull ;

  91.           }

  92. return mediaFile;

  93.       }

  94. @Override

  95. protectedvoid onPause() {

  96. super.onPause();

  97.               releaseMediaRecorder();       // if you are using MediaRecorder, release it first

  98.               releaseCamera();              // release the camera immediately on pause event

  99.           }

  100. privatevoid releaseCamera(){

  101. if (mCamera != null){

  102.                   mCamera.release();        // release the camera for other applications

  103.                   mCamera = null;

  104.               }

  105.           }

  106. privatevoid releaseMediaRecorder(){

  107. if (mMediaRecorder != null) {

  108.                   mMediaRecorder.reset();   // clear recorder configuration

  109.                   mMediaRecorder.release(); // release the recorder object

  110.                   mMediaRecorder = null ;

  111.                   mCamera.lock();           // lock camera for later use

  112.               }

  113.           }    

  114. }


本文出自 “whithin's” 博客,请务必保留此出处http://whithin.blog.51cto.com/690417/1063573