以 Android SDK 版本 29 为目标后,读取/写入下载文件夹被拒绝

Posted

技术标签:

【中文标题】以 Android SDK 版本 29 为目标后,读取/写入下载文件夹被拒绝【英文标题】:Read/write to Downloads folder denied after targeting Android SDK version 29 【发布时间】:2021-04-02 00:25:51 【问题描述】:

我的 Flutter 应用需要读取和写入下载文件夹(更准确地说是/storage/emulated/0/Download)。

在针对 SDK 版本 29(build.gradle 中的targetSdkVersion 29)之前,一切顺利,只是通过请求

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion" />

AndroidManifest.xml.

令我惊讶的是,在将新版本部署到我的手机后,该应用程序在尝试访问该文件夹时开始引发访问被拒绝错误,尽管已授予上述两个权限的访问权限。我想这是因为我将 targetSDKVersion 更改为 29。

解决方案是将android:requestLegacyExternalStorage="true" 添加到AndroidManifest.xml 中的&lt;app&gt; 节点。

不过,Android 11 似乎会忽略这个标志,所以这只是一个临时修复。

那么,我的问题是:在即将推出的 Android 版本中,确保对 Flutter 应用程序下载文件夹的访问权限的正确、官方、可靠的方法是什么?

下载文件夹的使用是一个严格的要求。

谢谢!

【问题讨论】:

从 android 11 下载或保存任何文档或在存储中制作文件夹,您必须将其保存在标准目录之一,如下载、图片、音乐。即使您不能直接在本地存储中创建任何文件夹,例如 /storage/emulated/0/testfolder。如果我们针对 android 11,我们必须创建像这样的文件夹“/storage/emulated/0/Download/testfolder/files”。 【参考方案1】:

不过,Android 11 似乎会忽略这个标志,

的确如此。它在 Android 11 设备上毫无用处。它仅适用于 Android 10 设备。

所以这只是一个临时修复。

不可以,因为对于 Android 10 设备,它将继续工作。

对于 Android 11 设备,您不需要它,因为您可以像 10 之前一样读取公共文件夹,例如再次下载。

【讨论】:

以上是关于以 Android SDK 版本 29 为目标后,读取/写入下载文件夹被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

如何更改我的flutter android应用程序的api sdk版本[重复]

我想将我的应用程序目标sdk版本29降级到28,google play控制台可以允许吗?

修改Android Studio默认的API Level(SDK版本)

在android studio中将targetSDK更改为29后关闭应用程序

将目标 sdk 版本更新为 30 后,OkHttpProfilerInterceptor 不起作用

Android Min SDK 版本与目标 SDK 版本