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);
}
暂时禁止评论













闽公网安备 35020302000061号