首次启动应用程序时,我需要读取存储在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”中的文件?
答案 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之前,有一种临时解决方法,可以启用旧版模式。