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

Android 14下Flutter Web文件选择器包行为异常求助

Android 14下Flutter文件选择器不再显示相机选项的问题解决

这不是Android的Bug,而是Android 14(API 34)的Intent行为变更导致的官方设计改动。

问题原因

旧版Android中,调用ACTION_GET_CONTENT(FilePicker、image_picker等包底层均使用该Intent)选择图片时,系统会自动添加相机作为可选来源;但Android 14开始,系统不再默认补充相机选项,必须由开发者显式提供相机入口。

解决方案

由于第三方文件选择包的默认实现未适配该变更,你需要手动为用户提供相机/图库的选择入口,分别处理两种来源的图片:

1. 依赖包准备

确保pubspec.yaml中添加所需依赖:

dependencies:
  flutter:
    sdk: flutter
  file_picker: ^latest_version
  image_picker: ^latest_version
  permission_handler: ^latest_version # 用于动态申请相机权限

2. 权限配置

在android/app/src/main/AndroidManifest.xml中添加相机权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />

3. 实现自定义选择器

替换原来的_pickImage方法,改为先弹出选择框让用户选相机或图库:

// 动态申请相机权限
Future<bool> _requestCameraPermission() async {
  PermissionStatus status = await Permission.camera.request();
  return status.isGranted;
}

// 显示相机/图库选择弹窗
void _showImageSourcePicker() {
  showModalBottomSheet(
    context: context,
    builder: (context) => Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        ListTile(
          leading: const Icon(Icons.camera_alt),
          title: const Text('拍照'),
          onTap: () async {
            Navigator.pop(context);
            bool hasPermission = await _requestCameraPermission();
            if (!hasPermission) return;
            
            final XFile? photo = await ImagePicker().pickImage(source: ImageSource.camera);
            if (photo != null) {
              Uint8List imageBytes = await photo.readAsBytes();
              Uint8List? compressedImage = await compressImage(imageBytes);
              setState(() {
                imgList.add(compressedImage);
              });
            }
          },
        ),
        ListTile(
          leading: const Icon(Icons.photo_library),
          title: const Text('从图库选择'),
          onTap: () async {
            Navigator.pop(context);
            FilePickerResult? result = await FilePicker.platform.pickFiles(
              type: FileType.image,
              allowMultiple: true,
              allowCompression: true,
            );
            if (result != null && result.files.isNotEmpty) {
              for (var file in result.files) {
                Uint8List imageBytes = file.bytes!;
                Uint8List? compressedImage = await compressImage(imageBytes);
                setState(() {
                  imgList.add(compressedImage);
                });
              }
            }
          },
        ),
      ],
    ),
  );
}

4. 替换按钮点击事件

原来的按钮点击调用_pickImage(),现在改为调用_showImageSourcePicker()即可。

关键说明

  • 换包无效的原因:FilePicker、image_picker的默认实现均依赖系统ACTION_GET_CONTENT,而Android 14不再自动为该Intent添加相机选项,所以默认调用只会打开图库。
  • 手动拆分相机和图库的选择逻辑,能完全适配Android 14的行为变更,同时保留多文件选择的功能。

内容的提问来源于stack exchange,提问作者LiiOr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:30:00