Environment.getExternalStorageDirectory()弃用替代方法

时间:2019-07-14 12:39:29

标签: android

在SDK 29(Aka 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中,我无法再采用这种方法。

2 个答案:

答案 0 :(得分:2)

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

在定位到Android 10或更高版本的应用上,默认情况下此属性为“ false”。

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

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

答案 1 :(得分:0)

  

在SDK 29中,我无法再采用这种方法。

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

  

此类应用将如何迁移?

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