【问题标题】:Persisting files across reinstalls in app specific directory in Downloads folder在下载文件夹的应用程序特定目录中重新安装时保留文件
【发布时间】:2020-10-03 11:43:17
【问题描述】:

我们有一个应用程序允许用户下载文件并将其存储在本地。为了提供对文件的更大访问权限(例如,手动备份),文件被下载到下载目录中的应用特定文件夹中。

在 Android Q 之前,应用程序可以简单地使用 File API 来检查文件是否在本地存在并相应地更新 UI。但是,从那时起,我们已经转向使用 Mediastore API。但是,用户面临的问题之一是重新安装后无法访问下载的文件。重新安装后,该应用程序无法知道以前的安装是否有剩余文件。它永远无法正确管理文件夹。

范围存储文档说,SAF 是让应用程序完全访问文件夹读取和写入权限的方法。还有其他方法吗?如果我们要使用 SAF,我们需要如何在用户每次打开应用时请求权限?有什么方法可以持久化返回的 file 架构 URI?这个用例的文档很少(或者我们没有找到)。

谢谢。

【问题讨论】:

    标签: android scoped-storage


    【解决方案1】:

    您可以尝试使用the shared storage。它用于共享其他应用可以或应该可以访问并保存的用户数据,即使用户卸载了您的应用。

    要使用它,你需要MANAGE_EXTERNAL_STORAGE的权限。但是当您将应用提交到 Google Play 时,会有一些限制,请阅读here
    由于 COVID-19 问题,需要 MANAGE_EXTERNAL_STORAGE 权限的应用无法上传到 Google Play。所以现在,您可以将 SDK 版本定位为 29,并使用 requestLegacyExternalStorage 标志。 2021 年初之后,您可以尝试使用共享存储。

    【讨论】:

    • 不确定谁将被允许使用MANAGE_EXTERNAL_STORAGE 是个问题。我们没有资格作为文件管理器或备份应用程序,尽管应用程序本身仅限于少数用户并且代码库是开源的。
    • 即使您想使用 SAF,在 Android 11(API 级别 30)及更高版本上,您也无法使用 ACTION_OPEN_DOCUMENT_TREE 意图操作来请求访问 Downloads 目录,这意味着您无法列出其中的所有文件下载文件夹,可以参考here.
    • 是的。我意识到这一点。我对 SAF 的意图是让用户访问 Downloads 文件夹中的特定文件夹。
    • 另一种更复杂的解决方案是将所有文件编码为音频文件或图像文件,您可以使用MediaStore API 进行查询。
    【解决方案2】:

    对于 Android 10 设备,请求清单文件中的旧版外部存储,并且您像往常一样拥有对下载文件夹的文件访问权限。

    对于 Android 11 设备,下载文件夹以旧方式可读,甚至可写。无需媒体商店。

    【讨论】:

    • 对于 Android 11,我能否在重新安装后访问我的应用程序的文件?如果我没记错的话,与旧应用程序(不同的 uid)相比,重新安装应用程序实际上是另一个应用程序。我问这个是因为 Android R 的存储文档谈到使用 SAF 访问其他应用程序的非媒体文件(我们主要处理 PDF、Word 文档、电子表格等)。
    • 您可以在 Android 11 模拟器上测试这一切。老实说,我不太确定。
    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 2014-10-17
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    相关资源
    最近更新 更多