【问题标题】:How to solve OS Error: Permission denied, errno = 13 in flutter如何解决 OS 错误:Permission denied, errno = 13 in flutter
【发布时间】:2020-03-06 06:20:22
【问题描述】:

我是 Flutter 的新手。我想将我的文档文件存储到 '/storage/emulated/0/Download/'。我有关于Unhandled Exception: FileSystemException: Cannot open file, path = '/storage/emulated/0/Download/file.pdf' (OS Error: Permission denied, errno = 13)的错误

这是我的代码:

void download() async {
http.Response response = await http.post(url, headers: {"Accept": "application/json", HttpHeaders.authorizationHeader: 'Bearer}});

  File file = new File('/storage/emulated/0/Download/file.pdf');
  await file.writeAsBytes(response.bodyBytes);
}

【问题讨论】:

    标签: flutter


    【解决方案1】:

    在 Android Q 中,您需要在 AndroidManifest 文件中添加以下行:

     <application
          android:requestLegacyExternalStorage="true"
    

    【讨论】:

    • 是不是和targetSdkVersion 29的变化有关?
    • 是的,有道理。如果您的targetSdkVersion 是 28,则不需要此行。如果tourtargetSdkVersion是29以上,需要这条线
    • 添加这个后,如果你得到error: attribute android:requestLegacyExternalStorage not found,检查this answer。具体来说,确保你在 android/app/build.gradle 中有compileSdkVersion = 29
    【解决方案2】:

    如果您使用的是 android 10/Q,只需将以下行添加到您的 android 清单中

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
       <application
            android:requestLegacyExternalStorage="true"
        >
    

    【讨论】:

    • 这对我有用...谢谢。我把 android:requestLegacyExternalStorage="true" 现在工作正常了
    • 是的,这仅适用于 android 10Q 之后
    【解决方案3】:

    我遇到了同样的问题

    我的解决办法:

    使用permission_handler

    import 'package:permission_handler/permission_handler.dart';
    

    在下载操作之前,您需要检查存储权限:

    var status = await Permission.storage.status;
                      if (!status.isGranted) {
                        await Permission.storage.request();
                      }
    

    希望对身体有所帮助

    【讨论】:

      【解决方案4】:

      确保您在AndroidManifest file 中定义了这样的权限:

      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.xxx.yyy">
          <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
          <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
      ...
      </manifest>
      

      欲了解更多信息,请尝试this 链接

      【讨论】:

      • 谢谢您的回复,我已经把这些权限给了,但仍然有错误
      • @qing 你是在真机还是模拟器上运行这段代码?
      • 真机运行
      • 所以转到设置/应用程序并在您的真实设备中检查您的应用程序的权限
      • 你检查了我回答中的附加链接吗?
      【解决方案5】:

      除了 Rajil TL 的回答还包括

      targetSdkVersion 28
      

      并停止进程并运行应用程序。热重载不足以反映 build.gradle 的变化。

      【讨论】:

        【解决方案6】:

        您必须在 AndroidManifest.xml 文件中添加 android:requestLegacyExternalStorage="true" 这个。

        <application 
        android:label="app_name"
                android:icon="@mipmap/ic_launcher"
                android:requestLegacyExternalStorage="true"
         </application>
        

        【讨论】:

          【解决方案7】:

          只需更改 build.gradle 文件中的 targetSdkVersion to 28。重新构建应用程序并运行,它工作正常。

          【讨论】:

            【解决方案8】:

            在我的情况下,没有一个解决方案起作用,最后起作用的是从 android/app/build.gradle 中删除 defaultConfig 中对“targetSdkVersion XX”的引用{}

            现在一切都按预期工作了,我猜这是框架中的一个错误。

            【讨论】:

              【解决方案9】:

              我在 Galaxy s9 上遇到过这个问题。我无法使用最后使用的图片——我不得不点击顶部的相册和照片选项卡,然后应用程序再次请求许可,然后它就起作用了。 也许有人会需要这些信息

              【讨论】:

                猜你喜欢
                • 2019-07-08
                • 2022-12-02
                • 2018-07-21
                • 2021-08-22
                • 1970-01-01
                • 2020-12-07
                • 2017-02-12
                • 2020-12-12
                • 1970-01-01
                相关资源
                最近更新 更多