CameraX预览及权限正常点击拍照按钮无响应问题如何解决
问题根因
你的代码核心问题是未初始化ImageCapture实例,也没有将ImageCapture拍照用例绑定到相机生命周期,导致takePhoto()方法中val imageCapture = imageCapture ?: return逻辑触发,直接提前终止方法执行,没有走后续拍照流程。
修复步骤
1. 修改startCamera()方法,补充ImageCapture初始化与绑定逻辑
修改后的startCamera()完整代码如下:
private fun startCamera() { val viewFiner = findViewById<PreviewView>(R.id.previewView) val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener({ //Used to bind the lifecycle of camera to the lifecycle owner val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get() //Preview val preview = Preview.Builder().build().also { it.setSurfaceProvider(viewFiner.surfaceProvider) } // 新增:初始化ImageCapture拍照用例,赋值给全局变量 imageCapture = ImageCapture.Builder() .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) .build() //Select back camera as a default val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA try { //Unbind use cases before rebinding cameraProvider.unbindAll() //Bind use cases to camera,新增传入imageCapture参数绑定用例 cameraProvider.bindToLifecycle( this, cameraSelector, preview, imageCapture ) } catch (exc: Exception) { Log.e(TAG, "Use case binding failed", exc) Toast.makeText(this, "Use case binding failed: $exc", Toast.LENGTH_SHORT).show() } }, ContextCompat.getMainExecutor(this)) }
2. 可选排查(如果点击按钮连"Processing.."的Toast都不弹出)
如果点击按钮后连takePhoto()开头的Toast都未显示,说明点击事件未触发,可以做以下检查:
- 给Button设置明确的背景色,确认Button是否正常渲染在PreviewView上层,没有被其他透明View遮挡
- 检查是否有其他触摸事件拦截逻辑消费了按钮的点击事件
3. 补充优化点
你的权限配置里WRITE_EXTERNAL_STORAGE权限仅在Android 9及以下系统需要,Android 10及以上系统使用CameraX存储照片到私有目录不需要该权限,可以做版本适配减少权限申请。
内容的提问来源于stack exchange,提问作者Georgi Tasev
相关产品推荐
相关产品推荐

