我有一个使用自定义CameraX的流程,如下:
这是我用Camera X运行相机预览的代码:
- 打开相机实时预览
- 点击按钮拍照
- 点击按钮后触发一系列操作 (路径转换为位图、旋转图像、自动裁剪图像、保存到设备)
- 在所有操作成功完成后,将图像发送到其他Fragment并在Glide中显示
这是我用Camera X运行相机预览的代码:
class CameraFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_camera, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewFinder.post { setupCamera() }
}
private fun setupCamera() {
CameraX.unbindAll()
CameraX.bindToLifecycle(
this,
buildPreviewUseCase(),
buildImageCaptureUseCase()
)
}
private fun buildPreviewUseCase(): Preview {
val preview = Preview(
UseCaseConfigBuilder.buildPreviewConfig(
viewFinder.display
)
)
preview.setOnPreviewOutputUpdateListener { previewOutput ->
updateViewFinderWithPreview(previewOutput)
correctPreviewOutputForDisplay(previewOutput.textureSize)
}
return preview
}
private fun buildImageCaptureUseCase(): ImageCapture {
val capture = ImageCapture(
UseCaseConfigBuilder.buildImageCaptureConfig(
viewFinder.display
)
)
cameraCaptureImageButton.setOnClickListener {
capture.takePicture(
FileCreator.createTempFile(JPEG_FORMAT),
Executors.newSingleThreadExecutor(),
object : ImageCapture.OnImageSavedListener {
override fun onImageSaved(file: File) {
// I want make a freeze camera preview when execute this before launch *launchGalleryFragment(path)*
val bitmap = BitmapFactory.decodeFile(file.absolutePath)
val rotatedBitmap = bitmap.rotate(90)
val croppedImage = cropImage(rotatedBitmap, viewFinder, rectangle)
val path = saveImage(croppedImage)
requireActivity().runOnUiThread {
launchGalleryFragment(path)
}
}
override fun onError(
imageCaptureError: ImageCapture.ImageCaptureError,
message: String,
cause: Throwable?
) {
Toast.makeText(requireContext(), "Error: $message", Toast.LENGTH_LONG)
.show()
Log.e("CameraFragment", "Capture error $imageCaptureError: $message", cause)
}
})
}
return capture
}
private fun launchGalleryFragment(path: String) {
val action = CameraFragmentDirections.actionLaunchGalleryFragment(path)
findNavController().navigate(action)
}
}
CameraX.unbind(preview)
函数?我尝试在onImageSaved()
中添加,但它会崩溃。 - R Rifa Fauzi KomaraonImageSaved()
中,我使用了 CameraXBasic 示例进行了测试,并且它可以正常工作。我认为这是由于您的执行器引起的,您可以尝试像 CameraXBasic 示例一样使用ContextCompat.getMainExecutor(requireContext())
。 - LaurentP22FreezeCallback
。我需要一些非标准依赖吗? - Sk1X1ImageCapture.OnImageSavedCallback.onImageSaved(ImageCapture.OutputFileResults)
,将outputFileResults.getSavedUri设置给ImageView.setImageURI(Uri)。 第一步是保存; 第二步是读取。 - 卡尔斯路西法