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

Kotlin+CameraX应用相机权限获取失败问题求助

解决CameraX相机权限申请返回-1的问题

以下是针对你遇到的权限问题的具体解决思路:

1. 修正Manifest配置错误

<uses-permission>标签不支持android:required和android:requiredFeature属性,这两个属性属于<uses-feature>标签。请将Manifest中的相机权限配置修正为:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
    android:name="android.hardware.camera.any"
    android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
  • android.hardware.camera.any适配更多设备(包括前置/后置相机),如果只需要特定相机可改为android.hardware.camera
  • 移除权限标签中的无效属性,避免Manifest合并时出现异常

2. 排查Manifest合并冲突

使用Android Studio的合并Manifest工具(路径:Tools > App Links Assistant > Open Merged Manifest)查看最终生成的Manifest:

  • 检查是否有依赖库通过tools:node="remove"移除了相机权限
  • 如果发现权限被覆盖,在你的Manifest中添加tools:node="merge"强制保留权限:
    <uses-permission android:name="android.permission.CAMERA" tools:node="merge" />
    

3. 修复动态权限申请逻辑

(1)使用标准权限常量判断

避免直接用-1判断权限状态,改用PackageManager提供的常量,代码更健壮:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED) {
    // 申请权限
} else {
    // 执行拍照
}

(2)改用AndroidX推荐的Activity Result API

旧的requestPermissions回调机制容易出现异常,推荐使用更可靠的ActivityResultContracts:

// 注册权限申请回调
private val requestCameraPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
    if (isGranted) {
        takePicture()
    } else {
        // 权限被拒绝,引导用户去设置开启
        AlertDialog.Builder(this)
            .setTitle("需要相机权限")
            .setMessage("拍照功能需要相机权限,请在设置中开启")
            .setPositiveButton("去设置") { _, _ ->
                val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
                    data = Uri.fromParts("package", packageName, null)
                }
                startActivity(intent)
            }
            .setNegativeButton("取消", null)
            .show()
    }
}

// 触发权限申请
requestCameraPermission.launch(Manifest.permission.CAMERA)

4. 检查设备端权限状态

  • 手动进入设备应用设置,查看你的应用是否被授予相机权限
  • 如果用户之前永久拒绝了权限,动态申请弹窗不会再弹出,必须引导用户去设置中手动开启

5. 验证CameraX初始化逻辑

权限问题解决后,确认CameraX的初始化和绑定是否正确:

// 示例:使用ProcessCameraProvider绑定相机生命周期
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
    val cameraProvider = cameraProviderFuture.get()
    // 绑定ImageCapture等用例
}, ContextCompat.getMainExecutor(this))

内容的提问来源于stack exchange,提问作者Manuel Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:48:20