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

Android FileProvider二次调用拍照触发SecurityPermission权限拒绝问题

问题分析与解决方案

错误原因

这个SecurityException是因为相机应用没有权限写入你通过FileProvider生成的Uri对应的文件。FileProvider出于安全要求,exported属性必须设为false,所以不能通过开启exported解决问题,只能通过临时授权让相机应用获取Uri的读写权限。

首次拍照正常、第二次失败的核心问题:你复用了全局的Intent对象,首次拍照后该Intent的权限已失效,且第二次生成新Uri时,没有为相机应用重新授予该Uri的读写权限,导致相机无法写入新文件。此外,代码中FileProvider的authorities存在拼写不一致(代码中是net.aaa.bbb.fileprovider,错误日志中是net.aaaa.bbb.fileprovider),这也会导致权限验证失败。

修复步骤

1. 修正FileProvider配置与代码的一致性

检查AndroidManifest.xml中的FileProvider配置,确保authorities与代码中完全一致,同时保证grantUriPermissions为true、exported为false:

<provider
    android:name="net.qingmowan.Inspection.custom.MyFileProvider"
    android:authorities="net.aaa.bbb.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

2. 每次拍照创建新Intent并授予权限

不要复用全局Intent,每次点击拍照时创建新的Intent,并添加读写权限标志,确保相机应用能访问新生成的Uri:

image.setOnClickListener {
    photoURI = getPhotoUri()
    photoURI?.let { uri ->
        // 每次创建新的拍照Intent
        val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
        // 授予相机应用Uri的读写权限
        captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
        captureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        launcher.launch(captureIntent)
    }
}

3. 修正代码语法错误

createImageFile中的Log语句存在语法问题,修正为:

private fun createImageFile(): File {
    val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    val timeStamp = Date()
    val file = File.createTempFile("inspection_${timeStamp.time}", ".jpg", storageDir).absoluteFile
    Log.e("file_message", String.format("name:%s, path:%s", file.name, file.absolutePath))
    return file
}

内容的提问来源于stack exchange,提问作者卡尔斯路西法

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:30:16