参考博文:www.jianshu.com/p/f79855586…,www.jianshu.com/p/ac450cb78…
上面两篇博文写得非常详细,这里单纯对自己的学习内容做个记录。
- 布局,需要一个用来预览的TextureView,点击拍照的Button,开启闪光灯的Button。
- 参照上面两篇博文,代码如下:
- 更新相机预览
// 更新相机预览:主要是给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.结束