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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:34:54