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,提问作者卡尔斯路西法
相关产品推荐
相关产品推荐

