Capturing Photos之Controlling the Camera

    xiaoxiao2026-08-18  1

    可以直接使用API来控制camera. 一般在onCreate中new一个thread或者在onResume中来调用camera.open()来打开一个camera. private boolean safeCameraOpen(int id) {     boolean qOpened = false;     try {         releaseCameraAndPreview();         mCamera = Camera.open(id);         qOpened = (mCamera != null);     } catch (Exception e) {         Log.e(getString(R.string.app_name), "failed to open Camera");         e.printStackTrace();     }     return qOpened; } private void releaseCameraAndPreview() {     mPreview.setCamera(null);     if (mCamera != null) {         mCamera.release();         mCamera = null;     } } 需要一个preview class才能来时preview. class Preview extends ViewGroup implements SurfaceHolder.Callback {     SurfaceView mSurfaceView;     SurfaceHolder mHolder;     Preview(Context context) {         super(context);         mSurfaceView = new SurfaceView(context);         addView(mSurfaceView);         // Install a SurfaceHolder.Callback so we get notified when the         // underlying surface is created and destroyed.         mHolder = mSurfaceView.getHolder();         mHolder.addCallback(this);         mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);     } } 要实现SurfaceHolder.Callback来将camera的数据传送会application. 那要如何开始preview 呢? 先调用setPreviewDisplay 后再调用startPreview public void setCamera(Camera camera) {     if (mCamera == camera) { return; }     stopPreviewAndFreeCamera();     mCamera = camera;     if (mCamera != null) {         List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes();         mSupportedPreviewSizes = localSizes;         requestLayout();         try {             mCamera.setPreviewDisplay(mHolder);         } catch (IOException e) {             e.printStackTrace();         }         // Important: Call startPreview() to start updating the preview         // surface. Preview must be started before you can take a picture.         mCamera.startPreview();     } } 可以调用setCameraDisplayOrientation() 来是设置camera的方向. 调用 Camera.takePicture() 来照相。可以创建Camera.PictureCallback和Camera.ShutterCallback 作为camera.takePicture的参数. 如果想连续的获取图片,可以调用Camera.PreviewCallback()方法. 可以在shutter button回调函数中重新开始preview @Override public void onClick(View v) {     switch(mPreviewState) {     case K_STATE_FROZEN:         mCamera.startPreview();         mPreviewState = K_STATE_PREVIEW;         break;     default:         mCamera.takePicture( null, rawCallback, null);         mPreviewState = K_STATE_BUSY;     } // switch     shutterBtnConfig(); } 当不使用camera的时候,应该要停止preview 释放camera资源. public void surfaceDestroyed(SurfaceHolder holder) {     // Surface will be destroyed when we return, so stop the preview.     if (mCamera != null) {         // Call stopPreview() to stop updating the preview surface.         mCamera.stopPreview();     } } /**  * When this function returns, mCamera will be null.  */ private void stopPreviewAndFreeCamera() {     if (mCamera != null) {         // Call stopPreview() to stop updating the preview surface.         mCamera.stopPreview();         // Important: Call release() to release the camera for use by other         // applications. Applications should release the camera immediately         // during onPause() and re-open() it during onResume()).         mCamera.release();         mCamera = null;     } }
    转载请注明原文地址: https://ju.6miu.com/read-1311306.html
    最新回复(0)