Flutter使用ImagePicker调用相机报already_active异常解决方法
Flutter image_picker 相机调用报already_active错误解决方案
问题复现场景
使用image_picker: ^0.8.5+3插件,传入ImageSource.camera参数调用相机拍照时,抛出如下错误:PlatformException(already_active, Image picker is already active, null, null)
原有调用代码如下:
final XFile? image = await _picker.pickImage( source: ImageSource.camera, imageQuality: 100, maxWidth: 768, maxHeight: 1024); if (image != null) { listImageFile.add(File(image.path)); }
对应开发环境:
- Kotlin: 1.6.21
- JVM: 1.8.0_333
- 操作系统: Windows 10 10.0 amd64
- Gradle版本: 6.7
- Android Gradle插件版本: 7.2.1
- Flutter版本: 3.0.1 稳定版、Dart 2.17.1
- 测试设备: Android 8.1.0(API 27)x86模拟器
错误原因
该错误由插件内部的活跃状态校验触发:当插件检测到存在未结束的图片选择流程时,会直接抛出该异常阻止重复调用。常见触发原因包括:
- 短时间内重复点击拍照按钮,前一次相机调用流程未完成就发起了新请求
- Android端Activity返回栈异常,前一次相机页面没有正常销毁,插件侧的活跃标记未被重置
- 0.8.5+3版本的image_picker在API27及以下版本的Android模拟器上存在状态标记未正常释放的已知bug
- 模拟器相机配置异常、缺少必要权限导致相机页面启动失败,状态未回收
修复步骤
- 增加防重复调用拦截
在调用选图逻辑前增加状态锁,从业务层避免重复触发,修改后的代码如下:// 作为State类的成员变量定义,不要放在build方法里 bool _isImagePicking = false; Future<void> _pickImageFromCamera() async { if (_isImagePicking) return; _isImagePicking = true; try { final XFile? image = await _picker.pickImage( source: ImageSource.camera, imageQuality: 100, maxWidth: 768, maxHeight: 1024, ); if (image != null) { setState(() { listImageFile.add(File(image.path)); }); } } catch (e) { debugPrint('相机调用异常: $e'); } finally { // 无论成功、失败、取消,都重置状态标记 _isImagePicking = false; } } - 补全Android端配置
- 打开
android/app/src/main/AndroidManifest.xml,在manifest节点下添加相机权限声明:<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> - 打开
android/app/src/main/kotlin/对应包名路径/MainActivity.kt,将MainActivity的父类替换为FlutterFragmentActivity,解决Activity返回结果回调异常的问题:import io.flutter.embedding.android.FlutterFragmentActivity class MainActivity: FlutterFragmentActivity() { // 其他原有逻辑保留 }
- 打开
- 修复模拟器环境问题
- 完全关闭当前模拟器,执行冷启动,不要使用Flutter热重载/热重启,先卸载设备上已安装的旧版APP再重新运行
- 打开模拟器设置-高级设置,将前后摄像头选项从
None修改为Emulated,保存后重启模拟器
- 升级插件版本修复已知bug
0.8.5+3版本的状态重置bug已经在后续补丁版本中修复,将pubspec.yaml中的image_picker依赖修改为:
执行dependencies: flutter: sdk: flutter image_picker: ^0.8.9flutter clean、flutter pub get后重新编译安装即可。
内容的提问来源于stack exchange,提问作者masoud jabbarian
相关产品推荐
相关产品推荐

