Android开发:调用camera API 创建MediaRecorder
2012-11-19 09:54
495 查看
1. add below three permission into AndroidManifest.xml file
2. get a camera instance
3. implement a preview for the user to preview the live image for the camera
4.initialize MediaRecorder for video recording
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.
本文出自 “whithin's” 博客,请务必保留此出处http://whithin.blog.51cto.com/690417/1063573
<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 }
3. implement a preview for the user to preview the live image for the camera
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()); } } }
4.initialize MediaRecorder for video recording
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 ; }
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.
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 image 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 images 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 } } }
本文出自 “whithin's” 博客,请务必保留此出处http://whithin.blog.51cto.com/690417/1063573
相关文章推荐
- Android开发:调用camera API 创建MediaRecorder
- Android开发: 调用Camera API 创建Camera
- Android开发: 调用Camera API 创建Camera
- (Android开发技巧系列)创建公用组件和在新应用中调用组件
- Android新浪微博开发(三)完结篇之调用新浪微博API实现信息展示
- Android Studio Jni开发(二)实现Native调用java方法和Native调用Android API
- Android开发-API指南-创建 Content Provider
- Android开发 调用系统隐藏API
- Android开发-调用系统隐藏API
- Android 音视频开发(四):使用 Camera API 采集视频数据
- Android开发中控件的三种点击事件+短信API调用方式
- android开发之调用手机的摄像头使用MediaRecorder录像并播放
- Android开发launcher、setting类应用时调用Android系统隐藏api的方法
- Android 音视频开发(四):使用 Camera API 采集视频数据
- Android开发:如何在Eclipse 中调用Android 源码里的隐藏API
- Android开发学习之以CameraAPI方式实现相机功能(一)——快速实现相机
- android 应用开发,利用反射机制调用非官方api
- Android开发学习之以CameraAPI方式实现相机功能(二)——相机功能配置
- Android开发: 通过Intent 调用Camera应用 sample code