<
>

JetPack开发中使用CameraX完成拍照和拍视频功能

2020-06-04 15:00:41 来源:易采站长站 作者:于海丽

//Future表示一个异步的任务,ListenableFuture可以监听这个任务,当任务完成的时候执行回调
 ListenableFuture<ProcessCameraProvider> cameraProviderFuture =
  ProcessCameraProvider.getInstance(this);
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();

//重新绑定之前必须先取消绑定
cameraProvider.unbindAll();

Camera camera = cameraProvider.bindToLifecycle(CameraActivity.this,
  cameraSelector,preview,imageCapture,videoCapture);

OK预览,照相,录视频的配置和绑定到生命周期的工作就完成了

预览的时候需要显示到一个View控件上吧,CameraX中提供了一个PreviewView用来显示预览画面。其内部封装了TextureView和SurfaceView,可以根据不同的模式来选择其内部使用TextureView还是SurfaceView来显示。

xml中添加PreviewView,并在代码中将其附加到前面创建出来的Preview这个实例上

<androidx.camera.view.PreviewView
 android:id="@+id/view_finder"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />

 preview.setSurfaceProvider(mPreviewView.createSurfaceProvider(camera .getCameraInfo()));

这样当我们进入该页面的时候就可以看到相机的预览效果呢,接下来就是执行拍照和录制的功能了

执行拍照录像

拍照:

//创建图片保存的文件地址
 File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath(),
  System.currentTimeMillis() + ".jpeg");
 ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(file).build();
 mImageCapture.takePicture(outputFileOptions,mExecutorService , new ImageCapture.OnImageSavedCallback() {
 @Override
 public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
  Uri savedUri = outputFileResults.getSavedUri();
  if(savedUri == null){
  savedUri = Uri.fromFile(file);
  }
  outputFilePath = file.getAbsolutePath();
  onFileSaved(savedUri);
 }

 @Override
 public void onError(@NonNull ImageCaptureException exception) {
  Log.e(TAG, "Photo capture failed: "+exception.getMessage(), exception);
 }
 });
//将前面保存的文件添加到媒体中
private void onFileSaved(Uri savedUri) {
 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
  sendBroadcast(new Intent(android.hardware.Camera.ACTION_NEW_PICTURE, savedUri));
 }
 String mimeTypeFromExtension = MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap
  .getFileExtensionFromUrl(savedUri.getPath()));
 MediaScannerConnection.scanFile(getApplicationContext(),
  new String[]{new File(savedUri.getPath()).getAbsolutePath()},
  new String[]{mimeTypeFromExtension}, new MediaScannerConnection.OnScanCompletedListener() {
   @Override
   public void onScanCompleted(String path, Uri uri) {
   Log.d(TAG, "Image capture scanned into media store: $uri"+uri);
   }
  });
 PreviewActivity.start(this, outputFilePath, !takingPicture);
 }
              
暂时禁止评论

微信扫一扫

易采站长站微信账号