关于 Android 11 范围存储和与版本 < Android 10 的兼容性的全面数据迁移

Comprehensive data migration regarding Android 11 scoped storage and compatibility with versions < Android 10

Android 11 由于 Scoped 存储更新,我几乎所有的应用程序都已过时! 好的,我先说:

选项 #1 - android:requestLegacyExternalStorage="true" 对我不起作用,即使我仍然以 sdk 29 为目标。

选项 #2 - <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> 也没有用。

但这并不重要,因为选项 #1 只会暂时起作用,而选项 #2 在发布到商店时需要证明其合理性。

现在我只剩下选项 #3 - 将我的所有数据迁移到范围存储中。

我的应用基本上做 3 件事:

现在我的问题:

  1. 因为我需要一个字符串路径,所以我需要将名为 Test 的文件夹从资产文件夹复制到范围存储中?如果是这样,如何?或者有别的办法吗?

  2. 如何将位图保存到范围存储?我应该遵循本教程吗:https://www.youtube.com/watch?v=tYQ8AO58Aj0

  3. 如何从分区存储中读取保存的文件?

  4. 如果我进行上述所有调整,它们是否适用于所有 Android 版本?或者我是否基本上需要检查 android 版本并对 <10 使用 Environment.getExternalStorageDirectory() 和对 >= 10 使用 Scoped Storage

getExternalFilesDir(subfolderNameInScopedStorage) 替换所有出现的 Environment.getExternalStorageDirectory() - 这需要在 Context 上调用,所以在 ActivityService 中或者你可以获得 Context 来自例如Fragment 通过使用 getContext() 方法

两种方法都返回 File,这是一个用于存储文件的目录(但它们有不同的路径),因此您的其余代码不会更改并且应该可以工作

getExternalFilesDir 自 Android 4.4 以来在 API 中,因此在旧设备上您仍然可以使用旧的 getExternalStorageDirectory() 方法,只需在 if适当的地方 - 你应该有一种常见的(static?)方法来获取存储文件的主目录