关于 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 件事:
将资产文件夹中名为 Test 的文件夹复制到 Environment.getExternalStorageDirectory()
中,因为我需要一个字符串路径。
生成图像并将其写入Environment.getExternalStorageDirectory()
。
正在读取来自 Environment.getExternalStorageDirectory()
的保存图像。
现在我的问题:
因为我需要一个字符串路径,所以我需要将名为 Test 的文件夹从资产文件夹复制到范围存储中?如果是这样,如何?或者有别的办法吗?
如何将位图保存到范围存储?我应该遵循本教程吗:https://www.youtube.com/watch?v=tYQ8AO58Aj0
如何从分区存储中读取保存的文件?
如果我进行上述所有调整,它们是否适用于所有 Android 版本?或者我是否基本上需要检查 android 版本并对 <10 使用 Environment.getExternalStorageDirectory()
和对 >= 10 使用 Scoped Storage?
用 getExternalFilesDir(subfolderNameInScopedStorage)
替换所有出现的 Environment.getExternalStorageDirectory()
- 这需要在 Context
上调用,所以在 Activity
、Service
中或者你可以获得 Context
来自例如Fragment
通过使用 getContext()
方法
两种方法都返回 File
,这是一个用于存储文件的目录(但它们有不同的路径),因此您的其余代码不会更改并且应该可以工作
getExternalFilesDir
自 Android 4.4 以来在 API 中,因此在旧设备上您仍然可以使用旧的 getExternalStorageDirectory()
方法,只需在 if
适当的地方 - 你应该有一种常见的(static
?)方法来获取存储文件的主目录
Android 11 由于 Scoped 存储更新,我几乎所有的应用程序都已过时! 好的,我先说:
选项 #1 - android:requestLegacyExternalStorage="true"
对我不起作用,即使我仍然以 sdk 29 为目标。
选项 #2 - <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
也没有用。
但这并不重要,因为选项 #1 只会暂时起作用,而选项 #2 在发布到商店时需要证明其合理性。
现在我只剩下选项 #3 - 将我的所有数据迁移到范围存储中。
我的应用基本上做 3 件事:
将资产文件夹中名为 Test 的文件夹复制到
Environment.getExternalStorageDirectory()
中,因为我需要一个字符串路径。生成图像并将其写入
Environment.getExternalStorageDirectory()
。正在读取来自
Environment.getExternalStorageDirectory()
的保存图像。
现在我的问题:
因为我需要一个字符串路径,所以我需要将名为 Test 的文件夹从资产文件夹复制到范围存储中?如果是这样,如何?或者有别的办法吗?
如何将位图保存到范围存储?我应该遵循本教程吗:https://www.youtube.com/watch?v=tYQ8AO58Aj0
如何从分区存储中读取保存的文件?
如果我进行上述所有调整,它们是否适用于所有 Android 版本?或者我是否基本上需要检查 android 版本并对 <10 使用
Environment.getExternalStorageDirectory()
和对 >= 10 使用 Scoped Storage?
用 getExternalFilesDir(subfolderNameInScopedStorage)
替换所有出现的 Environment.getExternalStorageDirectory()
- 这需要在 Context
上调用,所以在 Activity
、Service
中或者你可以获得 Context
来自例如Fragment
通过使用 getContext()
方法
两种方法都返回 File
,这是一个用于存储文件的目录(但它们有不同的路径),因此您的其余代码不会更改并且应该可以工作
getExternalFilesDir
自 Android 4.4 以来在 API 中,因此在旧设备上您仍然可以使用旧的 getExternalStorageDirectory()
方法,只需在 if
适当的地方 - 你应该有一种常见的(static
?)方法来获取存储文件的主目录