Camera2 学习总结

Camera2预览步骤学习总结

  • 1.1 获取Camera服务打开Camera
    private TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) {
            Log.i(TAG,"onSurfaceTextureAvailable width:" + width + " height:" + height);
            if(mCameraManager == null){
                mCameraManager = (CameraManager)CameraActivity.this.getSystemService(Context.CAMERA_SERVICE);
            }
            try {
                String[] cameraIds = mCameraManager.getCameraIdList();
                for(String id : cameraIds){
                    Log.i(TAG,"id = " + id);
                }
                //open background camera
                if(cameraIds.length > 1) {

                    mCameraCharacteristics  = mCameraManager.getCameraCharacteristics(cameraIds[1]);
                    List> requestKeyList = mCameraCharacteristics.getAvailableSessionKeys();
                    for (CaptureRequest.Key requestKey : requestKeyList) {
                        Log.i(TAG,"requestKey.getName() = " +requestKey.getName());
                    }
                    StreamConfigurationMap configMap =  mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
                    //Size[] candidateSizes = configMap.getOutputSizes(Surface.class);
                    Size[] candidateSizes = configMap.getOutputSizes(ImageFormat.JPEG);
                    for (Size candidateSize : candidateSizes){
                        Log.i(TAG,"prview Width = " + candidateSize.getWidth() + " height = " + candidateSize.getHeight());
                    }
                    Log.i(TAG,"orientation = " + mCameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION));
                    //Log.i(TAG,"scenes = " + mCameraCharacteristics.get("com.mediatek.vsdoffeature.vsdofFeaturePreviewSize").toString());
                    mCameraManager.openCamera(cameraIds[1], mDeviceCallback, mBgHander);
                }
                //android.util.Log.i("zmao", "cameraIds = " + cameraIds.toString());
            } catch (Exception e){
                Log.i(TAG,"onSurfaceTextureAvailable exception " + e);
            }
        }
  • 1.2 CameraDevice.StateCallback回调创建预览请求
    private void createCameraPreviewSession(Handler handler) {
        try {
            Log.i(TAG,"createCameraPreviewSession");
            // 获取SurfaceTexture并设置默认缓冲区大小
            SurfaceTexture texture = mPreview.getSurfaceTexture();
            texture.setDefaultBufferSize(mPreview.getWidth(), mPreview.getHeight());
            // 创建预览Surface
            Surface surface = new Surface(texture);
            // 创建CaptureRequest.Builder并设置预览Surface为目标
            mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            mPreviewRequestBuilder.addTarget(surface);

            // 创建ImageReader并设置回调
//          mImageReader = ImageReader.newInstance(mTextureView.getWidth(), mTextureView.getHeight(), ImageFormat.JPEG, 1);
            mImageReader = ImageReader.newInstance(mPreview.getWidth(), mPreview.getHeight(), ImageFormat.JPEG, 1);
//            mImageReader = ImageReader.newInstance(mPreview.getWidth(), mPreview.getHeight(), ImageFormat.YUV_420_888, 2);
            mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, handler);

            // 将ImageReader的Surface添加到CaptureRequest.Builder中
            Surface readerSurface = mImageReader.getSurface();
            mPreviewRequestBuilder.addTarget(readerSurface);

            // 创建预览会话
            mCameraDevice.createCaptureSession(Arrays.asList(surface, readerSurface), mSessionCallback, handler);
            Log.i(TAG,"createCameraPreviewSession end");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 1.3 CameraCaptureSession.StateCallback中增加重复请求实施刷新
    private void updatePreview() {
        try {
            Log.i(TAG,"updatePreview");
            // 设置自动对焦模式
            mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

            // 构建预览请求

            // 发送预览请求
            mCameraCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  •  1.4 ImageReader.OnImageAvailableListener中监听刷新 
    private ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
            if(DBG) {
                Log.d(TAG, "onImageAvailable");
            }

            //获得mage
            Image image = null;
            try {
                //image = reader.acquireLatestImage();
                image = reader.acquireNextImage();
                if(mCapature){
                    Log.i(TAG,"capature save");
                    ImageSaver imageSaver = new ImageSaver(CameraActivity.this, image);
                    new Thread(imageSaver).start();
                } else {
                    image.close();
                }
            }catch(Exception e){
                Log.i(TAG,"OnImageAvailableListener error");
            }

如此Camera2预览基本实现

你可能感兴趣的:(Android,杂项,android)