Flutter 图像选择器崩溃

asw*_*rma 5 android 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();
      });
    }
  }
Run Code Online (Sandbox Code Playgroud)

这个小部件调用了这个函数

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,
          ),
        ),
      ],
    ),
  ),
)
Run Code Online (Sandbox Code Playgroud)

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

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

  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
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

我在 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"/>
Run Code Online (Sandbox Code Playgroud)

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

Muh*_*man 0

image_picker插件不再支持权限条件。例如,当我们尝试从应用程序访问相机时,该应用程序会询问我们的许可。现在,由于image_picker插件已经删除了该条件,因此我们需要使用插件手动请求许可permission_handler在此处阅读有关此更改的更多详细信息

使用插件在运行时手动添加请求,您应该能够摆脱此崩溃。

示例代码:

  // get permissions
  Future<PermissionStatus> _getPermission(perm) async {
    PermissionStatus permission = await PermissionHandler()
        .checkPermissionStatus(perm);
    if (permission != PermissionStatus.granted &&
        permission != PermissionStatus.disabled) {
      Map<PermissionGroup, PermissionStatus> permisionStatus =
      await PermissionHandler()
          .requestPermissions([perm]);
      return permisionStatus[perm] ??
          PermissionStatus.unknown;
    } else {
      print(permission);
      return permission;
    }
  }

  Future selectGallery() async {
    // check permission
    PermissionStatus permissionStatus = await _getPermission(PermissionGroup.photos);
    if (permissionStatus == PermissionStatus.granted) {
      var image = await ImagePicker.pickImage(source: ImageSource.gallery);
      setState(() {
        accessDenied = false;
        // do your work
      });
    } else {
      accessDenied = true;
      setState(() {});
      throw PlatformException(
        code: 'PERMISSION_DENIED',
        message: 'Access to location data denied',
        details: null,
      );
    }    
  }

  Future selectCamera() async {
    // check permission
    PermissionStatus permissionStatus = await _getPermission(PermissionGroup.camera);
    print(permissionStatus);
    if (permissionStatus == PermissionStatus.granted) {
      var image = await ImagePicker.pickImage(source: ImageSource.camera);
      setState(() {
        accessDenied = false;
        // do your work
      });
    } else {
      accessDenied = true;
      setState(() {});
      throw PlatformException(
        code: 'PERMISSION_DENIED',
        message: 'Access to location data denied',
        details: null,
      );
    }
  }
Run Code Online (Sandbox Code Playgroud)