【问题标题】:Environment.getExternalStorageDirectory() deprecation alternativesEnvironment.getExternalStorageDirectory() 弃用替代方案
【发布时间】:2019-07-14 12:39:29
【问题描述】:

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

getExtenalStoragePublicDirectory(字符串类型)

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

但使用 Context#getExternalFilesDir(String) 会在您的 App-Data 文件夹中返回一个文件夹。在您的应用卸载或数据清除时删除。

但请考虑 WhatsApp 或 Facebook Messenger 等应用如何保存备份和下载,使用外部存储并创建自定义文件夹来存储数据。

此类应用将如何迁移?有新方法吗?

我的应用程序是一个笔记应用程序,它将所有笔记备份到一个文件夹中,以便在应用程序删除或数据清除后恢复。在 SDK 29 中,我无法再遵循这种方法。

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以在清单文件中使用 标志 android:requestLegacyExternalStorage="true"

    在面向 Android 10 或更高版本的应用上,此属性默认为“false”。

    但是,在未来的 Android 版本中,此权限将不可用。

    对于下一个 Android 版本,我们应该使用范围存储。 更多信息here

    【讨论】:

      【解决方案2】:

      在 SDK 29 中,我无法再遵循这种方法。

      使用ACTION_OPEN_DOCUMENT_TREE 允许用户选择一个文档树,它可以是一个文件系统目录或其他东西。然后,使用 DocumentFile.fromTreeUri() 为该树创建一个 DocumentFile 并使用它来写入要存储在该树内的文档。

      此类应用将如何迁移?

      ACTION_OPEN_DOCUMENTACTION_OPEN_DOCUMENT_TREE 将是最有可能的两个设备选项。对于 WhatsApp 和 Facebook,他们可能只是选择将备份存储在他们的服务器上。

      【讨论】:

      • 是的,但是ACTION_OPEN_DOCUMENT_TREE 将选择权留给了用户。总是让用户决定他的数据将存储在哪里并不是一个好的选择。也很难重新找到该文件夹​​。我想这是一种方式,但我会继续寻找。
      • @AhmadUCG:“但是 ACTION_OPEN_DOCUMENT_TREE 将选择权留给了用户”——它是用户的设备,而不是你的。而且,它是用户的数据,而不是您的数据。 “但我会继续寻找”——我怀疑您会对结果感到失望,因为 API 级别 29 更改的重点是让用户掌握更多控制权。
      • 我觉得这只是外部存储/廉价 SD 卡战争中的又一枪。现在我们的内存将充满模因:(
      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2020-11-07
      • 2019-11-29
      • 2020-05-22
      • 1970-01-01
      相关资源
      最近更新 更多