Flutter中image_picker选择图片后应用崩溃问题求助
问题:image_picker ^0.8.7选择相册图片后崩溃(StringIndexOutOfBoundsException)
问题详情
在Flutter项目中使用image_picker ^0.8.7插件从相册选择图片后,应用直接崩溃,抛出java.lang.StringIndexOutOfBoundsException异常,日志显示异常根源在FileUtils.getBaseName方法。已通过permission_handler确认相机和存储权限已授予,禁用其他所有插件后问题仍存在,但在其他Flutter项目中使用该插件一切正常。
崩溃日志
E/AndroidRuntime( 1465): FATAL EXCEPTION: main E/AndroidRuntime( 1465): Process: com.hoeis.report_project, PID: 1465 E/AndroidRuntime( 1465): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2346, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:241387 flg=0x1 }} to activity {com.hoeis.report_project/com.hoeis.report_project.MainActivity}: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 E/AndroidRuntime( 1465): at android.app.ActivityThread.deliverResults(ActivityThread.java:4761) E/AndroidRuntime( 1465): at android.app.ActivityThread.handleSendResult(ActivityThread.java:4803) E/AndroidRuntime( 1465): at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49) E/AndroidRuntime( 1465): at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113) E/AndroidRuntime( 1465): at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71) E/AndroidRuntime( 1465): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2029) E/AndroidRuntime( 1465): at android.os.Handler.dispatchMessage(Handler.java:106) E/AndroidRuntime( 1465): at android.os.Looper.loop(Looper.java:233) E/AndroidRuntime( 1465): at android.app.ActivityThread.main(ActivityThread.java:7212) E/AndroidRuntime( 1465): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 1465): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:499) E/AndroidRuntime( 1465): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) E/AndroidRuntime( 1465): Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1 E/AndroidRuntime( 1465): at java.lang.String.substring(String.java:2036) E/AndroidRuntime( 1465): at io.flutter.plugins.imagepicker.FileUtils.getBaseName(FileUtils.java:134) E/AndroidRuntime( 1465): at io.flutter.plugins.imagepicker.FileUtils.getPathFromUri(FileUtils.java:70) E/AndroidRuntime( 1465): at io.flutter.plugins.imagepicker.ImagePickerDelegate.handleChooseMultiImageResult(ImagePickerDelegate.java:584) E/AndroidRuntime( 1465): at io.flutter.plugins.imagepicker.ImagePickerDelegate.onActivityResult(ImagePickerDelegate.java:547) E/AndroidRuntime( 1465): at io.flutter.embedding.engine.FlutterEngineConnectionRegistry$FlutterEngineActivityPluginBinding.onActivityResult(FlutterEngineConnectionRegistry.java:805) E/AndroidRuntime( 1465): at io.flutter.embedding.engine.FlutterEngineConnectionRegistry.onActivityResult(FlutterEngineConnectionRegistry.java:428) E/AndroidRuntime( 1465): at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onActivityResult(FlutterActivityAndFragmentDelegate.java:807) E/AndroidRuntime( 1465): at io.flutter.embedding.android.FlutterActivity.onActivityResult(FlutterActivity.java:724) E/AndroidRuntime( 1465): at android.app.Activity.dispatchActivityResult(Activity.java:7741) E/AndroidRuntime( 1465): at android.app.ActivityThread.deliverResults(ActivityThread.java:4754) E/AndroidRuntime( 1465): ... 11 more I/Process ( 1465): Sending signal. PID: 1465 SIG: 9 Lost connection to device.
调用代码
customButton(context, isLoading, "Get Image", () async { try { final pickedFile = await picker.pickMultiImage( imageQuality: 100, maxHeight: 1000, maxWidth: 1000); print(pickedFile.path.toString()); } catch (e) { print("error: $e"); } })
项目依赖
flutter_launcher_icons: ^0.12.0 parse_server_sdk_flutter: ^4.0.0 dio: ^5.0.3 shared_preferences: ^2.0.18 path: ^1.8.2 path_provider: ^2.0.13 camera: ^0.10.3+2 image_picker: ^0.8.7 ntp: ^2.0.0 permission_handler: ^10.2.0 flutter_riverpod: ^2.3.2 intl: ^0.18.0 geocoding: ^2.1.0 geolocator: ^9.0.2
解决办法
- 升级image_picker到最新稳定版:0.8.7版本存在已知的URI解析bug,后续版本(>=0.10.0)已修复该问题。执行命令:
flutter pub upgrade image_picker - 临时修复(无法升级时):修改插件Android端的
FileUtils.java文件,在getBaseName方法中添加索引合法性判断,避免出现-1索引的substring调用:
注意:修改插件源码需要找到本地缓存的插件目录,操作后需重新编译项目,建议优先选择升级版本。public static String getBaseName(String path) { int lastSep = path.lastIndexOf('/'); if (lastSep == -1) { return path; } return path.substring(lastSep + 1); } - 检查图片资源:确保选中的图片文件名不为空,避免特殊格式的URI导致解析失败。
内容的提问来源于stack exchange,提问作者ChristianPWH Work
相关产品推荐
相关产品推荐

