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

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路径配置文件

  1. 在android/app/src/main/res/目录下新建xml文件夹(如果已存在则跳过)
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 11:09:00