Flutter Android端使用ImagePicker调用真机相机触发Lost connection to device错误如何解决
ImagePicker 调用崩溃断开连接问题解决
问题根因
你遇到的Lost connection to device报错本质是应用触发崩溃被系统杀死,常见原因包括:
- 未申请安卓相机/存储权限,调用相机后触发权限错误崩溃
- 代码未处理空安全,用户取消拍照时
pickedFile为null,强制用!解包触发空指针崩溃 - 拍照未做压缩,高分辨率原图占内存过高触发OOM崩溃
- 系统开发者选项开启了「不保留活动」,启动相机后原Activity被销毁
- image_picker插件版本过低存在安卓适配bug
ImagePicker 正确使用方式
1. 前置配置(安卓端)
在android/app/src/main/AndroidManifest.xml中添加以下配置:
<!-- 相机权限 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 安卓12及以下存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <application ... <!-- 适配安卓10以上分区存储 --> android:requestLegacyExternalStorage="true" ...>
建议配合permission_handler插件在调用相机前主动申请权限,确认用户授权后再启动相机
2. 修正后的代码实现
import 'package:flutter/material.dart'; import 'dart:io'; import 'package:image_picker/image_picker.dart'; class FormTree extends StatefulWidget { const FormTree({Key? key}) : super(key: key); @override _FormTreeState createState() => _FormTreeState(); } class _FormTreeState extends State<FormTree> { File? image; // 全局复用ImagePicker实例 final ImagePicker _imagePicker = ImagePicker(); Future pickImage() async { // 可在此处插入权限申请逻辑 final XFile? pickedFile = await _imagePicker.pickImage( source: ImageSource.camera, // 添加压缩参数,避免原图过大导致OOM imageQuality: 60, maxWidth: 1080, maxHeight: 1920, ); // 非空判断后再处理,避免空指针崩溃 if (pickedFile != null) { setState(() { image = File(pickedFile.path); }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("拍照示例")), body: Container( child: ElevatedButton.icon( icon: const Icon(Icons.camera_alt_rounded), onPressed: pickImage, label: const Text("拍照"), // style: elevatedFormButton, ), ), ); } }
断连问题排查步骤
- 关闭设备开发者选项中的「不保留活动」「后台进程限制」等调试开关
- 将
image_picker插件升级到最新稳定版 - 若仍有崩溃,使用
adb logcat抓取安卓原生日志,定位具体崩溃原因
内容的提问来源于stack exchange,提问作者DVCone
相关产品推荐
相关产品推荐

