Skip to content

以后都要和相机为伴了,哈哈。在此开始维护一个Camera2相机。

Notifications You must be signed in to change notification settings

XuhaofuAdai/CustomCamera

Repository files navigation

CustomCamera

'高山流水 把酒奕欢 今朝有酒今朝醉 闲来无事码一篇' 1.获取拍照权限:

<uses-permission android:name="android.permission.CAMERA" /> <!--相机权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--存储权限-->

2.在TextureView的SurfaceTextureListener回调监听中,监听到

public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height){}

回调之后执行打开相机操作,包括以下内容

1.获取相机管理器CameraManager实例。

CameraManager cameraManager=(CameraManager)getService(Context.CAMERA_SERVICE);

2.在打开相机之前可以对相机进行预览尺寸设置。

 //获取相机特征
 CameraCharacteristics cameraCharacteristics = mCameraManager.getCameraCharacteristics(cameraTarget);
 //获取所有预览支持尺寸
 StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);  

可以在这些尺寸中遍历到自己需要的预览大小

/**
     * 查看最佳预览尺寸
     *
     * @param sizes
     * @param width
     * @param height
     * @return
     */
    private Size getPreferredPreviewSize(Size[] sizes, int width, int height) {
        List<Size> collectorSizes = new ArrayList<>();
        for (Size option : sizes) {
            if (width > height) {
                if (option.getWidth() > width && option.getHeight() > height) {
                    collectorSizes.add(option);
                }
            } else {
                if (option.getHeight() > width && option.getWidth() > height) {
                    collectorSizes.add(option);
                }
            }
        }
        if (collectorSizes.size() > 0) {
            return Collections.min(collectorSizes, new Comparator<Size>() {
                @Override
                public int compare(Size s1, Size s2) {
                    return Long.signum(s1.getWidth() * s1.getHeight() - s2.getWidth() * s2.getHeight());
                }
            });
        }
        return sizes[0];
    }

3.打开相机
这里注意状态回调这个设计,由于相机很多都是和底层设备打交道,不可避免的有延迟。
通过接口的方式获取设备状态的回调,可以优化我们的处理。
CameraDevice,CameraCaptureSession,CaptureRequest都是通过这种方式来获取状态的。

  //cameraTarget:相机前后置标识; 
  //mStateCallBack:相机打开状态回调
  //mCameraHandler;执行在HandlerThread的Handler
  mCameraManager.openCamera(cameraTarget, mStateCallback, mCameraHandler);

4.获取CameraDevice.
在CameraDevice.StateCallBack()的回调中,我们可以获取到通过Opened()获取到相机实例

   @Override
            public void onOpened(CameraDevice cameraDevice) {
                mCameraDevice = cameraDevice; //获取相机对象
                createCameraPreview();
            }

            @Override
            public void onDisconnected(CameraDevice cameraDevice) {
                mCameraDevice.close();
                mCameraDevice = null;
            }

            @Override
            public void onError(CameraDevice cameraDevice, int i) {
                mCameraDevice.close();
                mCameraDevice = null;
            }

获取到相机实例之后我们可以通过相机实例去创建会话CameraCaptureSession.建立与底层相机设备之间的会话通道,通过发送CaptureRequest完成我们想要的预览,拍照,录像等模式。

About

以后都要和相机为伴了,哈哈。在此开始维护一个Camera2相机。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages