Android調用Camera API 拍照


注意,Camera API在API>=21已經被廢棄了,建議使用android.hardware.camera2 API來進行操作。

調用Camera API拍照的流程如下:

To take pictures with this class, use the following steps:

  1. Obtain an instance of Camera from open(int).
  2. Get existing (default) settings with getParameters().
  3. If necessary, modify the returned Camera.Parameters object and call setParameters(Camera.Parameters).
  4. If desired, call setDisplayOrientation(int).
  5. Important: Pass a fully initialized SurfaceHolder to setPreviewDisplay(SurfaceHolder). Without a surface, the camera will be unable to start the preview.
  6. Important: Call startPreview() to start updating the preview surface. Preview must be started before you can take a picture.
  7. When you want, call takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) to capture a photo. Wait for the callbacks to provide the actual image data.
  8. After taking a picture, preview display will have stopped. To take more photos, call startPreview() again first.
  9. Call stopPreview() to stop updating the preview surface.
  10. Important: Call release() to release the camera for use by other applications. Applications should release the camera immediately in onPause() (and re-open() it in onResume()).

1、聲明所需權限

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

2、通過Camera.open()獲取Camera實例,對於多個攝像頭,那么需要遍歷getNumberOfCameras(),獲取每一個CameraInfo來判斷是前置攝像頭還是后置攝像頭。

int cameraId = 0 ;
int numberOfCameras = Camera.getNumberOfCameras();
CameraInfo cameraInfo = new CameraInfo();
for (int i = 0; i < numberOfCameras; i++) {
  Camera.getCameraInfo(i, cameraInfo);
  if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
    cameraId  = i ;
    break ;
   }
 } 

 3、Camera.Parameters類是對Camera的設置操作,包括閃光燈、自動對焦,場景,白平衡等,有需要可以設置。

PS:閃光燈就是setFlashMode(Camera.Parameters.FLASH_MODE_TORCH)來實現的

4、設置Camera的方向,官方提供的算法如下:

public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info =
             new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360;  // compensate the mirror
     } else {  // back-facing
         result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); }

5、設置預覽視圖(SurfaceHolder),一般在xml里面自定義SurfaceView,然后在Activity或者Fragment里面初始化

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {   View rootView = inflater.inflate(R.layout.fragment_photo, container, false);   SurfaceView surfaceView = (SurfaceView) rootView.findViewById(R.id.surface);   surfaceView.getHolder().addCallback(this);
  //此方法在API<11的手機上必須調用,否則沒有效果   surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  return rootView; }

6、啟動預覽和Camera聲明周期管理

   @Override   public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); } catch (Exception e) { e.printStackTrace(); return ; } setCameraDisplayOrientation(getActivity(), Camera.getNumberOfCameras()-1,mCamera); mCamera.startPreview(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); }

7、拍照直接調用Camera.takePicture()即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM