以 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
中的<app>
节点。
不过,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后关闭应用程序