首页 > 解决方案 > Flutter 图像选择器崩溃

问题描述

我想问一下,您是否曾经在 Android 上使用image_picker插件版本 0.6.3+4 从图库/相机中选择图像后遇到应用程序崩溃的情况?已经寻找答案 1 周没有答案可以帮助我,因为我认为这是我的项目存在一些兼容性问题。

这是我的情况。在我的原始项目中,该应用程序总是在从图库/相机中选择图像后立即崩溃,但是如果我将插件用于一个新的干净项目,只有一个带有 onPress 功能的按钮来选择图像,它可以工作,不会发生崩溃.

所以也许我认为在我原来的项目中有些东西导致了这个崩溃的发生。这是关于我如何使用 image_picker 的代码

  imageSelectorGallery() async {
    fileProfilePicture = await ImagePicker.pickImage(
      source: ImageSource.gallery,
    );

    if(fileProfilePicture != null) {
      setState(() {
        uploadPicture();
      });
    }
  }

该小部件调用该函数

new GestureDetector(
  onTap: () { 
    imageSelectorGallery();
  },
  child: new Container(
    child: new Column(
      children: <Widget>[
        new Container(
          width: 50,
          height: 50,
          decoration: BoxDecoration(
            color: Colors.blue,
            shape: BoxShape.circle,
          ),
          child: new Icon(
            FontAwesomeIcons.image,
            size: 22.0,
            color: Colors.white
          ),
        ),
        new Padding(padding: EdgeInsets.symmetric(vertical: 3.0)),
        new Text(
          "Gallery",
          style: new TextStyle(
            color: Colors.black,
            fontSize: 12.0,
          ),
        ),
      ],
    ),
  ),
)

当然,有一个相机按钮调用另一个类似的功能来从相机拍摄图像,但我认为如果我添加它会太长,而且它们都会导致相同的崩溃。

这是我在项目中使用的插件列表,我不知道是否有一些插件不能一起使用,但我希望这可以让我的问题更清楚。

  http: ^0.12.0+2
  font_awesome_flutter: ^8.5.0
  flutter_calendar_carousel: 1.3.16
  bubble_tab_indicator: "^0.1.4"
  chewie: ^0.9.7
  video_player: ^0.10.1+3
  toast: ^0.1.3
  shimmer: ^1.0.0
  flutter_responsive_screen: ^1.0.0
  flutter_webview_plugin: ^0.3.7
  webview_flutter: ^0.3.19+8
  audioplayer: 0.5.2
  image_picker: ^0.6.3+4
  shared_preferences: ^0.5.3+4
  sticky_headers: "^0.1.8"
  flutter_speed_dial: ^1.2.1
  url_launcher: ^5.1.2
  image_picker_saver: ^0.3.0
  smooth_star_rating: ^1.0.3
  flutter_secure_storage: ^3.3.1+1
  flutter_datetime_picker: ^1.2.8
  flutter_launcher_icons: "^0.7.3"
  youtube_player: ^3.5.0
  youtube_player_flutter: ^6.0.3+2
  wakelock: ^0.1.3+4

这是画廊打开之前直到应用程序崩溃之后的日志。

D/ViewRootImpl@e8d5055[MainActivity](19819): ViewPostIme pointer 0
D/ViewRootImpl@e8d5055[MainActivity](19819): ViewPostIme pointer 1
D/ViewRootImpl@e8d5055[MainActivity](19819): MSG_WINDOW_FOCUS_CHANGED 0 1
D/InputMethodManager(19819): prepareNavigationBarInfo() DecorView@7634a6a[MainActivity]
D/InputMethodManager(19819): getNavigationBarColor() -855310
D/SurfaceView(19819): onWindowVisibilityChanged(8) false io.flutter.embedding.android.FlutterSurfaceView{9f9cd1 V.E...... ........ 0,0-1080,1920} of ViewRootImpl@e8d5055[MainActivity]
D/SurfaceView(19819): show() Surface(name=SurfaceView - com.example.test_new_image_picker/com.example.test_new_image_picker.MainActivity@9f9cd1@1[19819])/@0x7cc5bde io.flutter.embedding.android.FlutterSurfaceView{9f9cd1 V.E...... ........ 0,0-1080,1920}
D/SurfaceView(19819): surfaceDestroyed callback.size 1 #2 io.flutter.embedding.android.FlutterSurfaceView{9f9cd1 V.E...... ........ 0,0-1080,1920}
W/libEGL  (19819): EGLNativeWindowType 0xd622b808 disconnect failed
D/SurfaceView(19819): destroy() Surface(name=SurfaceView - com.example.test_new_image_picker/com.example.test_new_image_picker.MainActivity@9f9cd1@1[19819])/@0x7cc5bde io.flutter.embedding.android.FlutterSurfaceView{9f9cd1 V.E...... ........ 0,0-1080,1920}
W/libEGL  (19819): EGLNativeWindowType 0xd622b008 disconnect failed
D/OpenGLRenderer(19819): eglDestroySurface = 0xf0c74920, 0xd622b000
D/ViewRootImpl@e8d5055[MainActivity](19819): Relayout returned: old=[0,0][1080,1920] new=[0,0][1080,1920] result=0x5 surface={false 0} changed=true
D/InputTransport(19819): Input channel destroyed: fd=95
D/ViewRootImpl@e8d5055[MainActivity](19819): stopped(true) old=false
D/SurfaceView(19819): windowStopped(true) false io.flutter.embedding.android.FlutterSurfaceView{9f9cd1 V.E...... ........ 0,0-1080,1920} of ViewRootImpl@e8d5055[MainActivity]
D/FlutterView(19819): Detaching from a FlutterEngine: io.flutter.embedding.engine.FlutterEngine@53149bd
D/SurfaceView(19819): onWindowVisibilityChanged(4) false io.flutter.embedding.android.FlutterSurfaceView{9f9cd1 V.E...... .......D 0,0-1080,1920} of ViewRootImpl@e8d5055[MainActivity]
D/ViewRootImpl@e8d5055[MainActivity](19819): Relayout returned: old=[0,0][1080,1920] new=[0,0][1080,1920] result=0x1 surface={false 0} changed=false
D/AndroidRuntime(19819): Shutting down VM
E/AndroidRuntime(19819): FATAL EXCEPTION: main
E/AndroidRuntime(19819): Process: com.example.test_new_image_picker, PID: 19819
E/AndroidRuntime(19819): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2342, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:8411 flg=0x1 }} to activity {com.example.test_new_image_picker/com.example.test_new_image_picker.MainActivity}: java.lang.IllegalStateException: Received image from picker that was not requested
E/AndroidRuntime(19819):        at android.app.ActivityThread.deliverResults(ActivityThread.java:4643)
E/AndroidRuntime(19819):        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4685)
E/AndroidRuntime(19819):        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
E/AndroidRuntime(19819):        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
E/AndroidRuntime(19819):        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
E/AndroidRuntime(19819):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1970)
E/AndroidRuntime(19819):        at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime(19819):        at android.os.Looper.loop(Looper.java:214)
E/AndroidRuntime(19819):        at android.app.ActivityThread.main(ActivityThread.java:7156)
E/AndroidRuntime(19819):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(19819):        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
E/AndroidRuntime(19819):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
E/AndroidRuntime(19819): Caused by: java.lang.IllegalStateException: Received image from picker that was not requested
E/AndroidRuntime(19819):        at io.flutter.plugins.imagepickersaver.ImagePickerDelegate.handleImageResult(ImagePickerDelegate.java:495)
E/AndroidRuntime(19819):        at io.flutter.plugins.imagepickersaver.ImagePickerDelegate.handleChooseImageResult(ImagePickerDelegate.java:434)
E/AndroidRuntime(19819):        at io.flutter.plugins.imagepickersaver.ImagePickerDelegate.onActivityResult(ImagePickerDelegate.java:413)
E/AndroidRuntime(19819):        at io.flutter.embedding.engine.FlutterEnginePluginRegistry$FlutterEngineActivityPluginBinding.onActivityResult(FlutterEnginePluginRegistry.java:634)
E/AndroidRuntime(19819):        at io.flutter.embedding.engine.FlutterEnginePluginRegistry.onActivityResult(FlutterEnginePluginRegistry.java:367)
E/AndroidRuntime(19819):        at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onActivityResult(FlutterActivityAndFragmentDelegate.java:546)
E/AndroidRuntime(19819):        at io.flutter.embedding.android.FlutterActivity.onActivityResult(FlutterActivity.java:594)
E/AndroidRuntime(19819):        at android.app.Activity.dispatchActivityResult(Activity.java:7791)
E/AndroidRuntime(19819):        at android.app.ActivityThread.deliverResults(ActivityThread.java:4636)
E/AndroidRuntime(19819):        ... 11 more
I/Process (19819): Sending signal. PID: 19819 SIG: 9
Lost connection to device.

我在 build.gradle 上使用 minSdk 21 和 targetSdk 28,我在我的 AndroidManifest 上使用了所有这些权限

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.hardware.camera.autofocus"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

所以哪位知道这个问题以及如何解决的请告诉我,谢谢。真的很感激。:)

标签: androidflutter

解决方案


发现问题了,最新版本的 Flutter 在 stable 频道 1.12.13+hotfix.9,你不能同时使用插件 image_picker 和 image_picker_saver,仍然不知道为什么,但是你可以在这个答案中添加评论如果你知道吗,谢谢。


推荐阅读