Android Kotlin中用Camera2 API实现CameraViewFinder遇访问权限异常
问题原因及解决方案
核心问题
- 依赖版本不匹配:你使用的
camera-viewfinder版本是1.3.0-beta02,但其他CameraX核心库(camera-camera2、camera-lifecycle、camera-view)都是1.3.0-rc01,版本不一致会导致类结构、访问权限出现冲突。 - 构造函数调用方式错误:
ViewfinderSurfaceRequest的类是public,但它的构造函数本身是包级私有,CameraX官方要求使用Builder模式创建实例,而非直接调用构造函数。
修复步骤
第一步:统一依赖版本
修改build.gradle中的依赖配置,将camera-viewfinder版本与其他库保持一致:
implementation "androidx.camera:camera-camera2:1.3.0-rc01" implementation "androidx.camera:camera-lifecycle:1.3.0-rc01" implementation "androidx.camera:camera-view:1.3.0-rc01" implementation "androidx.camera:camera-viewfinder:1.3.0-rc01"
第二步:改用Builder创建ViewfinderSurfaceRequest
替换原来直接实例化的代码,使用官方推荐的Builder模式构建对象:
import androidx.camera.viewfinder.ViewfinderSurfaceRequest import androidx.camera.viewfinder.CameraViewFinder val viewfinderSurfaceRequest = ViewfinderSurfaceRequest.Builder() .setResolution(Size(640, 480)) .setLensFacing(characteristics.get(CameraCharacteristics.LENS_FACING)!!) .setSensorOrientation(characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)!!) .setImplementationMode(CameraViewfinder.ImplementationMode.PERFORMANCE) .build() val surfaceListenableFuture = cameraViewFinder.requestSurfaceAsync(viewfinderSurfaceRequest) Futures.addCallback(surfaceListenableFuture, object : FutureCallback<Surface> { override fun onSuccess(result: Surface?) { /* 使用该Surface创建CaptureSession */ } override fun onFailure(t: Throwable) { /* 处理错误逻辑 */ } }, ContextCompat.getMainExecutor(cameraViewFinder.context))
补充说明
CameraX的API设计中,很多类会将构造函数设为包级私有,强制开发者使用Builder或静态工厂方法创建实例,以此保证参数合法性,同时方便后续版本扩展API。统一依赖版本则是避免因版本差异导致的类结构不兼容问题,这是使用AndroidX库的基本规范。
内容的提问来源于stack exchange,提问作者samedhrmn
相关产品推荐
相关产品推荐

