CameraX
-
调用ProcessCameraProvider.getInstance(),获取可监听的Future对象;
final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
-
为可监听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));
-
创建CameraSelector对象;
CameraSelector cameraSelector = new CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build();
-
创建Preview对象;
Preview preview = new Preview.Builder().build();
-
创建ImageAnalysis对象;
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build();
-
创建ImageCapture对象;
ImageCapture.Builder builder = new ImageCapture.Builder();
final ImageCapture imageCapture = builder .setTargetRotation(this.getWindowManager().getDefaultDisplay().getRotation()) .build();
-
通过ProcessCameraProvider将CameraSelector对象、Preview对象、ImageAnalysis对象、ImageCapture对象和当前活动的生命周期绑定;
cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview, imageAnalysis, imageCapture);
-
为Preview传入SurfaceProvider对象;
preview.setSurfaceProvider(mPreviewView.createSurfaceProvider());
-
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();
}
}); -
拍照完毕,回调对象的onImageSaved()或onError()调用。