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

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
  • 模拟器相机配置异常、缺少必要权限导致相机页面启动失败,状态未回收

修复步骤

  1. 增加防重复调用拦截
    在调用选图逻辑前增加状态锁,从业务层避免重复触发,修改后的代码如下:
    // 作为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;
      }
    }
    
  2. 补全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() {
        // 其他原有逻辑保留
      }
      
  3. 修复模拟器环境问题
    • 完全关闭当前模拟器,执行冷启动,不要使用Flutter热重载/热重启,先卸载设备上已安装的旧版APP再重新运行
    • 打开模拟器设置-高级设置,将前后摄像头选项从None修改为Emulated,保存后重启模拟器
  4. 升级插件版本修复已知bug
    0.8.5+3版本的状态重置bug已经在后续补丁版本中修复,将pubspec.yaml中的image_picker依赖修改为:
    dependencies:
      flutter:
        sdk: flutter
      image_picker: ^0.8.9
    
    执行flutter clean、flutter pub get后重新编译安装即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:30:54