Environment.getExternalStorageDirectory()的替代方案已被弃用

11

在SDK 29(又称Android_Q)中,使用方法Environment.getExternalStorageDirectory()访问外部存储已被弃用,并不再返回可访问的文件。

getExtenalStoragePublicDirectory(String type)

此方法从API级别29开始已过时。为了提高用户隐私保护,直接访问共享/外部存储设备已被弃用。当应用程序目标为Build.VERSION_CODES.Q时,此方法返回的路径不再可以直接由应用程序访问。应用程序可以继续通过迁移到替代方案,如Context#getExternalFilesDir(String),MediaStore或Intent#ACTION_OPEN_DOCUMENT来访问存储在共享/外部存储中的内容。

但是,使用Context#getExternalFilesDir(String)将返回一个位于您的App-Data文件夹内的文件夹。该文件夹在卸载应用程序或清除数据时被删除。

但是考虑到像WhatsApp或Facebook Messenger这样的应用程序如何保存其备份和下载,它们使用外部存储并创建自定义文件夹以存储其数据。

这样的应用程序将如何迁移?是否有新的方法?

我的应用程序是备份所有笔记并将其存储到一个文件夹中,以便在应用程序删除或清除数据后进行后续还原。在SDK 29中,我不能再使用这样的方法。

2个回答

3
你可以在你的清单文件中使用 标志 android:requestLegacyExternalStorage="true"
默认情况下,针对 Android 10 或更高版本的应用程序,此属性为“false”。
然而,在未来的 Android 版本中,这个权限将不可用。
对于下一个 Android 版本,我们应该使用作用域存储。更多信息在这里

2
在SDK 29中,我无法再按照这种方法进行操作。使用ACTION_OPEN_DOCUMENT_TREE允许用户选择文档树,它可以是文件系统目录或其他内容。然后,使用DocumentFile.fromTreeUri()为该树创建一个DocumentFile,并使用它来能够将要存储在该树内的文档写入其中。对于这样的应用程序,如何进行迁移?ACTION_OPEN_DOCUMENT和ACTION_OPEN_DOCUMENT_TREE将是设备上最有可能的两个选项。在WhatsApp和Facebook的情况下,他们可能会选择将备份存储在他们的服务器上。

是的,但ACTION_OPEN_DOCUMENT_TREE将选择权留给用户。这并不总是让用户决定数据存储在哪里的好选择。这也使得重新找到那个文件夹变得困难。 我想这是一种方式,但我会继续寻找。 - A-Android UCG
@AhmadUCG:“但ACTION_OPEN_DOCUMENT_TREE将选择留给用户”——这是用户的设备,不是你的。而且,这是用户的数据,不是你的。“但我会继续寻找”——我怀疑你会对结果感到失望,因为API Level 29变化的重点是将更多的控制权交给用户。 - CommonsWare
2
我觉得这只是对外部存储/廉价SD卡战争的又一次打击。现在我们的内部存储将会被梗图填满 :( - Dr Deo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接