Firemonkey相机崩溃:Android 11 FileProvider配置异常求助
解决Android 11下FileProvider相机拍照崩溃问题
1. 检查FileProvider路径配置文件
确保res/xml/file_paths.xml(或自定义文件名)中包含系统相机默认照片存储路径的配置,异常提示的/storage/emulated/0/DCIM/Camera/属于外部存储根目录下的子路径,需添加对应规则:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 保留你已有的其他配置,比如files-path、cache-path等 --> <!-- 配置外部存储根目录,覆盖DCIM/Camera路径 --> <external-path name="external_root" path="." /> <!-- 或者更精确地指定DCIM/Camera目录,提升权限安全性 --> <external-path name="camera_dcim" path="DCIM/Camera/" /> </paths>
2. 确认Manifest中FileProvider注册正确性
检查AndroidManifest.xml里的FileProvider配置,确保authorities与后续生成Uri时的标识一致,且指向正确的路径配置文件:
<application> <!-- 其他组件配置 --> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application>
3. 修正相机拍照的Uri生成逻辑
禁止直接使用文件绝对路径创建Uri,必须通过FileProvider生成符合Android 11要求的Content Uri,并授予相机应用临时权限:
// 假设已创建目标照片文件file Uri photoUri = FileProvider.getUriForFile( context, BuildConfig.APPLICATION_ID + ".fileprovider", // 与Manifest中authorities完全一致 file ); Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); // 授予相机读写该Uri的临时权限 takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); startActivityForResult(takePictureIntent, REQUEST_CAMERA_CODE);
4. 排查TTakePhotoFromCameraAction内部逻辑
如果使用的是第三方库或自定义的TTakePhotoFromCameraAction,需确认其内部是否硬编码了绝对路径生成Uri。若存在该情况,需修改其逻辑,替换为上述FileProvider生成Uri的方式。
5. 适配Android 11存储权限规则
目标API30下,通过FileProvider传递Uri的相机拍照场景,无需申请READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限,系统会自动通过临时权限机制允许相机读写指定文件。
内容的提问来源于stack exchange,提问作者Guillaume MARCHAL
相关产品推荐
相关产品推荐

