CameraX

  1. 调用ProcessCameraProvider.getInstance(),获取可监听的Future对象;
    final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);

  2. 为可监听Future对象设置监听器和执行监听器的线程池。在监听器中获取ProcessCameraProvider对象;

     cameraProviderFuture.addListener(new Runnable() {
         @Override
         public void run() {
             try {
    
                 ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                 bindPreview(cameraProvider);//进入后续步骤
    
             } catch (ExecutionException | InterruptedException | CameraInfoUnavailableException e) {
                 // No errors need to be handled for this Future.
                 // This should never be reached.
             }
         }
     }, ContextCompat.getMainExecutor(this));
    
  3. 创建CameraSelector对象;
    CameraSelector cameraSelector = new CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build();

  4. 创建Preview对象;
    Preview preview = new Preview.Builder().build();

  5. 创建ImageAnalysis对象;
    ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build();

  6. 创建ImageCapture对象;
    ImageCapture.Builder builder = new ImageCapture.Builder();
    final ImageCapture imageCapture = builder .setTargetRotation(this.getWindowManager().getDefaultDisplay().getRotation()) .build();

  7. 通过ProcessCameraProvider将CameraSelector对象、Preview对象、ImageAnalysis对象、ImageCapture对象和当前活动的生命周期绑定;
    cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview, imageAnalysis, imageCapture);

  8. 为Preview传入SurfaceProvider对象;
    preview.setSurfaceProvider(mPreviewView.createSurfaceProvider());

  9. ImageCapture对象调用.takePhoto方法,方法中指定OutPutOptions对象、线程池,和回调对象。
    ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(file).build();
    imageCapture.takePicture(outputFileOptions, executor, new ImageCapture.OnImageSavedCallback () {
    @Override
    public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
    Toast.makeText(MainActivity.this, "Image Saved successfully", Toast.LENGTH_SHORT).show();
    }
    });
    }
    @Override
    public void onError(@NonNull ImageCaptureException error) {
    error.printStackTrace();
    }
    });

  10. 拍照完毕,回调对象的onImageSaved()或onError()调用。

posted @ 2021-09-15 15:16  日进一卒  阅读(576)  评论(0)    收藏  举报