Flutter使用image_picker调用Android11相机出现FileProvider错误如何解决?
两个报错分别对应缺少FileProvider配置、FileProvider路径配置未覆盖image_picker的图片缓存目录,按照以下步骤配置即可解决:
步骤1:配置AndroidManifest.xml
打开android/app/src/main/AndroidManifest.xml,在<application>标签内部添加如下provider配置,${applicationId}会在打包时自动替换为你的应用包名,无需手动修改:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.flutter.image_provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
注意android:authorities的后缀必须为.flutter.image_provider,和错误日志提示的provider authority保持一致,不可随意修改。
步骤2:创建FileProvider路径配置文件
- 在
android/app/src/main/res/目录下新建xml文件夹(如果已存在则跳过) - 在
xml文件夹中新建file_paths.xml文件,写入如下配置:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 覆盖应用私有缓存目录,匹配报错的/data/data/<包名>/cache/路径 --> <cache-path name="app_cache" path="." /> <!-- 可选配置,覆盖其他常用存储路径,避免后续其他文件访问报错 --> <external-path name="external_storage" path="." /> <external-files-path name="app_external_files" path="." /> <external-cache-path name="app_external_cache" path="." /> </paths>
其中path="."表示授权访问对应目录下的所有子文件/文件夹,彻底解决找不到配置根目录的问题。
步骤3:Android 11+ 权限补充配置
在AndroidManifest.xml的<manifest>标签下添加必要权限:
<!-- 相机权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 存储权限,Android 13及以上无需WRITE_EXTERNAL_STORAGE权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
步骤4:Dart侧API优化(可选)
你当前使用的getImage是image_picker的废弃API,建议替换为新版API避免后续兼容问题:
File _image; final ImagePicker picker = ImagePicker(); Future pickImage(ImageSource source) async { try { final pickedFile = await picker.pickImage( source: source, preferredCameraDevice: CameraDevice.rear, ); if (pickedFile != null) { setState(() { _image = File(pickedFile.path); }); } } catch (e) { print("图片选择错误:$e"); } }
配置完成后执行flutter clean清理项目缓存,重新打包运行即可正常调用相机。
内容的提问来源于stack exchange,提问作者Burak Cabadan
相关产品推荐
相关产品推荐

