无法解码流:java.io.FileNotFoundException:/storage/emulated/0/Snapchat/Snapchat-441126967.jpg:打开失败:EACCES(权限被拒绝)

Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Snapchat/Snapchat-441126967.jpg: open failed: EACCES (Permission denied)

每次我尝试在我的 flutter 应用程序中选择图像时,我总是收到这个错误。虽然在应用程序上用我的相机拍摄实时照片效果很好,但是当我尝试访问我的存储时,错误不断出现。

注意: 我使用 image_picker 包来选择两个图像并访问相机。

Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Snapchat/Snapchat-441126967.jpg: open failed: EACCES (Permission denied)

一切正常,突然间我开始遇到这个问题。我已经完成了以下操作。

在我的android/app/src/main/AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我也将 requestLegacyExternalStorage 设置为 true。

在Pubsec.yaml

permission_handler: ^8.1.2
image_picker:

Flutter 版本

Flutter 2.0.5 • channel stable

选择图像的代码块

 Future<void> _pickImage(ImageSource source) async {
    print(":: Pick Image executed :::");
    try {
      await Permission.storage.request();
      var status = await Permission.storage.status;
      print(":::: The Status of the permission is ::::");
      print(status);
      if (status.isGranted) {
        File selected =
        await ImagePicker.pickImage(source: source, imageQuality: 30);
        final bytes = selected.readAsBytesSync();
        String _img64 = base64Encode(bytes);

        setState(() {
          _imageFile = selected;
          base64 = _img64;
        });
        uploadFile();
      }
    } catch (error) {
      print(error);
    }

  }

权限已授予,如权限包所示,但当我 select 来自设备图库的图像时,我仍然在一天结束时收到错误消息。

所以最终我发现问题只出现在 android 10 台设备上。前进的方向是将我的 image_picker 包更新到最新版本,目前是 0.8.1+3.

一切都很好。

这是因为 android 存储权限。他们在最新版本中解决了这个问题。请查看阅读我的文件。

从版本 0.8.1 开始,Android 实施支持在 Android 4.3 或更高版本上选择(多个)图像。

无需配置 - 插件应该开箱即用。

不再需要将 android:requestLegacyExternalStorage="true" 作为属性添加到 AndroidManifest.xml 中的标签,因为 image_picker 已更新为使用分区存储。