CameraX的预览,拍照,闪光灯模式

2,876 阅读1分钟
参考博文:www.jianshu.com/p/f79855586…www.jianshu.com/p/ac450cb78…
上面两篇博文写得非常详细,这里单纯对自己的学习内容做个记录。
  • 布局,需要一个用来预览的TextureView,点击拍照的Button,开启闪光灯的Button。
  • 参照上面两篇博文,代码如下:
  1. 更新相机预览

//    更新相机预览:主要是给TextureView设置一个旋转的矩阵变化,防止预览方向不对
private void updateTransform() {
    Matrix matrix = new Matrix();
    // Compute the center of the textureview
    float centerX = textureView.getWidth() / 2f;
    float centerY = textureView.getHeight() / 2f;

    float[] rotations = {0, 90, 180, 270};
    // Correct preview output to account for display rotation
    float rotationDegrees = rotations[textureView.getDisplay().getRotation()];

    matrix.postRotate(-rotationDegrees, centerX, centerY);

    // Finally, apply transformations to our TextureView
    textureView.setTransform(matrix);
}

2. 设置相机预览

PreviewConfig previewConfig = new PreviewConfig.Builder()
        .setTargetAspectRatio(new Rational(1, 1))
        .setTargetResolution(new Size(640, 640))
        .build();

Preview preview = new Preview(previewConfig);
preview.setOnPreviewOutputUpdateListener(new Preview.OnPreviewOutputUpdateListener() {
    @Override
    public void onUpdated(Preview.PreviewOutput output) {
        ViewGroup parent = (ViewGroup) textureView.getParent();
        parent.removeView(textureView);
        parent.addView(textureView, 0);
        //textureView就是布局中的textureView
        textureView.setSurfaceTexture(output.getSurfaceTexture());
        updateTransform();
    }
});

3.照相

//    照相
        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
                .setTargetAspectRatio(new Rational(1, 1))
                .setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
                .build();
        imageCapture = new ImageCapture(imageCaptureConfig);
        buttonTakePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    photo = File.createTempFile("shoes", ".jpg");
                } catch (IOException e) {
                    e.printStackTrace();
                }
                imageCapture.takePicture(photo, new ImageCapture.OnImageSavedListener() {
                    @Override
                    public void onImageSaved(@NonNull File file) {
//下面这段是Fragment携带照片跳转
                        System.out.println("Succeed");
                        Bundle bundle = new Bundle();
                        bundle.putString("imagePath", photo.toString());
                        ShowPhotoFragment showPhotoFragment = new ShowPhotoFragment();
                        showPhotoFragment.setArguments(bundle);
                        FragmentUtils.hideFragment(TakingPhotoFragment.this);
                        FragmentUtils.addFragment(getFragmentManager(), showPhotoFragment, R.id.container, false, true);
                        FragmentUtils.addFragment(getFragmentManager(), new DistinguishFragment(), R.id.container, false, true);
                    }

                    @Override
                    public void onError(@NonNull ImageCapture.UseCaseError useCaseError, @NonNull String message, @Nullable Throwable cause) {
                        System.out.println("Faile");
                    }
                });
            }
        });

4.关联生命周期

CameraX.bindToLifecycle(this, preview, imageCapture);

5.打开闪光灯,FlashMode有三种模式,ON为打开,OFF为关闭,AUTO从字面上来看是自动,但实践效果是无法打开闪光灯

//lighting 为闪光灯状态
if (lightning == false){
//这里的imageCapture是拍照代码段中的imageCapture,设置imageCaptureConfig也有同样的效果
    imageCapture.setFlashMode(FlashMode.ON);
    lightning = true;
    Toast.makeText(getActivity().getApplicationContext(),"闪光灯已打开",Toast.LENGTH_SHORT).show();
}else {
    imageCapture.setFlashMode(FlashMode.OFF);
    lightning = false;
    Toast.makeText(getActivity().getApplicationContext(),"闪光灯已关闭",Toast.LENGTH_SHORT).show();
}

6.结束