You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin中用Camera2 API实现CameraViewFinder遇访问权限异常

问题原因及解决方案

核心问题

  1. 依赖版本不匹配:你使用的camera-viewfinder版本是1.3.0-beta02,但其他CameraX核心库(camera-camera2、camera-lifecycle、camera-view)都是1.3.0-rc01,版本不一致会导致类结构、访问权限出现冲突。
  2. 构造函数调用方式错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:25:05