如何从Android 10,Target API 29中的设备共享存储(根目录)中读取现有文件?

时间:2019-12-24 08:20:09

标签: android android-10.0 android-api-levels

首次启动应用程序时,我需要读取存储在android根目录(/ storage / emulated / 0 / MyFolder)中的文件。

使用Environment.getExternalStorageDirectory()可以达到API级别28,但是在我迁移到API级别29之后,Environment.getExternalStorageDirectory()被弃用并停止使用以下消息。

  

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

我还尝试了Context().getExternalFilesDir(null),它仅返回以下路径“ /storage/emulated/0/Android/data/com.myapp.appid/files/”,但我需要访问“ /”中的文件存储/模拟/ 0 /”路径。

那么在以目标API级别29运行时,如何以合法方式读取位置“ / storage / emulated / 0 / MyFolder”中的文件?

1 个答案:

答案 0 :(得分:1)

唯一的方法是要求用户使用Intent#ACTION_OPEN_DOCUMENT选择文件,然后用户不太可能以任何方式选择该目录。

Google表示要进行此更改的目的是阻止应用程序到处散布文件/文件夹,并让用户控制。应用程序专用目录之外的文件路径的概念已不复存在,您必须对非专用内容使用MediaStore或SAF(存储访问框架)。

展望未来,您将无法拥有自己的应用程序的公用文件夹(除非在外部SD卡上),只能将内容存储为视频,图像,音频或下载(所有其他文件类型)。

注意:目前,许多Android 10之前的制造商都提供了一个文档提供程序,通过该文件提供程序,您可以访问主分区的根目录以及外部SD卡,但是如果您查看普通Android设备提供的内容,操作系统模拟器映像或Google文档中,您将看不到主根分区的提供信息,因为这会破坏Google声明的更改意图。

请参见https://developer.android.com/training/data-storage/

更具体地说

https://developer.android.com/training/data-storage/shared/documents-files

您可以要求用户选择一个文件夹(将在受限的公共位置下),然后可以以编程方式访问和检查此位置的文件。参见https://developer.android.com/training/data-storage/shared/documents-files#grant-access-directory

您可以询问用户一次,然后存储他们授予您的权限,以使用https://developer.android.com/training/data-storage/shared/documents-files#persist-permissions

访问文件/文件夹

注意: 在Android 11之前,有一种临时解决方法,可以启用旧版模式​​。