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
相关产品推荐
相关产品推荐

