我想编写自己的简易文件浏览器。
现在,File API不能用于外部存储。
此版本还提供了对作用域存储的改进,使开发人员更容易迁移到使用这种存储模型。
我不明白如何使用作用域存储来访问/sdcard。
我想编写自己的简易文件浏览器。
现在,File API不能用于外部存储。
此版本还提供了对作用域存储的改进,使开发人员更容易迁移到使用这种存储模型。
我不明白如何使用作用域存储来访问/sdcard。
如果您正在寻找文件选择体验,Storage Access Framework现在是您唯一的选择。下面的代码让您选择多个文件。如果您想进行目录级别的选择,则可以使用ACTION_OPEN_DOCUMENT_TREE
意图。
private fun openStorageAccess() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
type = "*/*"
addCategory(Intent.CATEGORY_OPENABLE)
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
}
startActivityForResult(intent, openDirectoryAccessCode)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == openDirectoryAccessCode && resultCode == Activity.RESULT_OK) {
val fileUris = data?.clipData ?: data?.data
}
}
MediaStore.Files
请求特殊的所有文件访问权限。有关Android 11存储更改的更多信息。requestLegacyExternalStorage =“true”
)。MANAGE_EXTERNAL_STORAGE
标志ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
意图打开设置来提示用户允许所有文件访问。MediaStore.Files
查询所有文件以及RELATIVE_PATHDCIM/Vacation/IMG_1234.jpg
的内容。考虑到这一点,我想重申几个与新的作用域存储更改有关的区别问题,其他人在编写自己的自定义代码时可能会遇到。我希望这能为开发人员节省一些未来因某些在Android开发者文档的某些不充分记录部分中似乎是常见问题(对我而言)而导致的障碍。随着Android 11开始在野外设备上占据更多的生活,我的这些问题可能会被整合到官方文档中。目前,我建议参考以下几个参考点:
现在,使用更标准(甚至是可移植的)Java I/O或NIO调用获取文件系统数据(如POSIX样式权限)变得棘手,因为Android API的新限制。根据我从Android 10 OS开发设备中获取的信息,当您尝试通过创建DocumentsProvider
的子类来访问MatrixCursor
类型列数据时,系统会授予特殊权限。这就是说,新的更改将返回真正的System-V-Unix样式传统路径(例如/storage/0/self/primary/Pictures/Screenshots
),但似乎不喜欢以此方式明确引用这些文件以外的特殊文件提供程序继承方案(叹息)。我找到的唯一从硬编码路径枚举的有效Java File
实例中提取POSIX样式权限的方法在我的库代码中有所提及见此处的内联链接。你的体验可能会有所不同。DocumentsProvider
子类能够返回Java文件(对于本地文件系统情况)的Unix类型路径的句柄,否则返回不符合此规范的抽象文件类型引用的Uri
对象。一般来说,随着新的API要求向前迈进,子类化的DocumentsProvider
负责为实际文件数据提供服务(通常作为String
或Byte[]
数组),并且当前用户可以通过熟悉的路径名称枚举这些文件以进行选择。不用说,对于希望在程序读取文件内容之前让用户按名称选择文件的开发人员来说,这会使使用模式变得复杂。AndroidManifest.xml
选项可用于绕过当前Android 10设备上的作用域存储要求。请在我的编译链接中阅读列出的(库Markdown参考)。这些遗留行为启用器包括android:requestLegacyExternalStorage
和android:preserveLegacyExternalStorage
application
标签选项。请注意,这种类型的兼容性适用于11版操作系统之前的设备,具有奇怪的反直觉缺点,需要在本地应用程序build.gradle
文件中设置新的MinSdkVersion
。appCtx.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)
可能会返回一个空的Java File
处理程序,但如果我们正确配置用于与AndroidManifest
文件一起使用的XML文件路径名称,则硬编码路径(例如new File("/storage/self/primary/Documents")
)仍然可以正常工作。 <provider
android:name="com.maxieds.androidfilepickerlightlibrary.BasicFileProvider"
android:authorities="com.maxieds.androidfilepickerlightlibrary.FileChooserActivity"
android:exported="true"
android:enabled="true"
android:grantUriPermissions="true"
android:permission="android.permission.MANAGE_DOCUMENTS"
android:initOrder="100"
>
<intent-filter>
<action android:name="android.content.action.DOCUMENTS_PROVIDER" />
</intent-filter>
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths_base" />
</provider>
对我刚才冗长的评论感到抱歉。希望这能为将来节省一些人的时间。-- M