AS 中有一个关于 android.permission.WRITE_EXTERNAL_STORAGE
的 lint 警告。该警告表示,针对 Android 10 及更高版本时,该权限将不再提供写访问权限。删除上述权限仍然可以写入内部存储文件夹 Pictures/MY_APP_NAME
以保存图像,但它仅适用于 Android 10 (SDK 29) 和/或更高版本(尚未在 Android R 上测试)。当我在 Android M (SDK 23) 等较低版本上再次测试时,保存图像停止工作,所以我决定返回 android.permission.WRITE_EXTERNAL_STORAGE
因此警告再次出现。棉绒是否可能只是误报,错误地诊断了不同情况下的问题?因为目前我的支持 SDK 从 21 开始,最新的是 30,但 lint 仅指出在针对 Android 10 (SDK 29) 时不再需要它,并且没有考虑回顾项目的最低 SDK 支持。
原文由 Mihae Kheel 发布,翻译遵循 CC BY-SA 4.0 许可协议
解决方法是实际上忽略警告,因为它只是信息性的,因此无害。将 maxSdkVersion 设置为 28 就不用再担心了。
请注意,使用其他答案中所述的 android:requestLegacyExternalStorage 标志不是解决方案,它只是一个临时补丁,在 Android 11 (API 30) 和未来版本中将不再有效
更新,以澄清一些开发人员在评论中表现出的疑虑和困惑:
如果在 Android 10 (API 29) 中使用 requestLegacyExternalStorage 标志,则照常请求 WRITE_EXTERNAL_STORAGE 权限。
标志 requestLegacyExternalStorage 在 Android 11 (API 30) 中不执行任何操作,它被完全忽略,并且没有解决方法。
WRITE_EXTERNAL_STORAGE 在 Android 11 (API 30) 中不提供任何权限,它什么也不做,因此在 API 11 中您需要将 maxSdkVersion 设置为 29 。
如果在 Android 10 (API 29) 中您也没有使用 requestLegacyExternalStorage ,则将 maxSdkVersion 设置为 28 而不是 29 。
从 Android 11 (API 30) 开始,旧的 文件 API 可以再次使用,但“仅”在访问公共“共享存储”文件夹(DCIM、音乐等)或您的应用“私有”目录时使用。对于其他位置,需要 DocumentFile API。
考虑到文件 API 现在在 Android 11 (API 30) 中要慢得多,因为它已经被重构为本质上是一个包装器。这是为了仅在允许的位置强制使用它。因此,它不再是一个快速的系统文件 API,而只是一个在内部将工作委托给 MediaStore 的包装器。在 Android 11 或更高版本中使用文件 API 时,您应该考虑性能损失,因为根据 Android 团队的说法,这比直接访问 MediaStore 慢 2 到 3 倍。