Android 10:将外部存储中的文件保存到名为“ / sdcard / my-app /”的目录中有哪些选择?

Dan*_*l F 5 android file-access android-external-storage android-10.0

在Android Pie之前,我始终存储应用程序需要存储在上的文件,这些文件/sdcard/my-app/是通过

File fBaseDir = new File(Environment.getExternalStorageDirectory(), "my-app");

我的一个应用程序在其中存储了数百个(最多数千个)收藏夹图标/sdcard/my-app/favicons,当用户创建该应用程序的备份时,它将存储在中/sdcard/my-app/backups。与我的应用共享时,Chrome浏览器拍摄的网页屏幕快照存储在中/sdcard/my-app/screenshots,依此类推。

当我卸载该应用程序时,我可以稍后重新安装它,并且仍然具有所有图标,屏幕快照和备份可用于恢复状态,而不必重新下载所有图标(并且可能丢失了所有其他数据)。

我还可以/sdcard/my-app/通过将目录复制到PC上轻松创建该目录的备份,并在另一部手机上将其还原,例如,当我迁移到新设备时。

我还可以使用文件浏览器查看该目录中的文件,然后选择并通过电子邮件发送或将其复制到Google云端硬盘,或专门删除其中的一些文件(例如旧的备份文件)。

在Android 10中,这种方法已经崩溃。我无法将图标添加到Images Media-Folder,因为它们不是真实图像,它们会不必要地使视图混乱,并可能禁止我的开发者帐户进入Play商店。我也不想将所有这些数据存储在App-Private目录中,因为在卸载该应用程序时,这些数据将被删除,并且因为其他应用程序(例如资源管理器)无法访问它们。

我有什么选择?手动选择文件或目录不是一种选择,除非目录只需要选择一次,然后永久授予访问权限(以读取和写入文件)。

我从不在外面读书或写东西/sdcard/my-app/

gre*_*f82 27

在 Android Q 中,默认情况下禁用私有文件夹外的应用程序的直接文件访问。这里有一些你可以在你的情况下使用的策略:

  1. 使用 manifest 选项requestLegacyExternalStorage具有旧行为,但它不再适用于 Android R,因此它确实是一个短期解决方案;
  2. 使用getExternalFilesDir()方法保存文件。这是你的私人文件夹,其他应用程序只有在他们有READ_EXTERNAL_STORAGE权限的情况下才能访问这些文件。在这种情况下,最好使用FileProvider授予对其他应用程序访问您的文件的权限。
  3. 使用getPrimaryStorageVolume().createOpenDocumentTreeIntent()类的方法StorageManager请求访问外部主卷。在这种情况下,您需要用户同意,并且File无论如何您都无法直接使用api,但是使用DocumentFileclass 您有一个非常相似的界面,因此这是更接近旧行为的解决方案。如果您需要在前台和后台执行操作,即没有用户交互,除了第一次请求权限的交互,它都可以工作。

我为第 3 点链接了Flipper库,它有助于像在旧的 android 版本中一样管理文件。