android - Android Q - 如何获取外部 SD 卡公共下载目录路径
问题描述
如果我理解正确,在 Android Q 中,您的应用程序可以使用 api 在不可移动存储上读取/写入下载目录:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
这转化为
/storage/emulated/0/Downloads
或可移动存储上的公共下载目录(Android Q 中的新功能),即
/storage/08E7-324HI/Downloads
如何使用 API 获取第二个目录?
解决方案
实际上是Environment.getExternalStorageDirectory()和Environment。getExternalStoragePublicDirectory(String type)方法已被弃用,在 Android Q(或更高版本)设备上调用它们将返回 null File对象。
正如您在下表中所见(取自此处的 Android 开发者文档),现在访问“下载”目录的最佳方式是通过存储访问框架:
通过存储访问框架打开文件是一个两步过程。
首先,触发启动系统文件选择器的意图,如下所示:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "*/*"
startActivityForResult(intent, OPEN_DOCUMENT_REQUEST_CODE)
其次,在活动的onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)方法中监听结果,如下所示:
if (requestCode == OPEN_DOCUMENT_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) {
val uri = data?.data
if (uri == null) {
showAlertDialog("Error", "Got back a null URI")
return
}
val inputStream = contentResolver.openInputStream(uri)
if (inputStream == null) {
showAlertDialog("Error", "Failed reading the contents of the selected file")
return
}
// TODO: read the input stream as makes sense in your application
} else {
showToast("No file selected")
}
}
您可以参考Storage Access Framework开发人员指南,以类似方式了解如何创建、编辑或删除文件。
推荐阅读
- arrays - 如何在没有循环的情况下获取过滤数组中元素的位置
- vue.js - 如何使用单独的 JS 函数过滤/搜索元素 UI 表
- python - 带有条件“方法”对象的 Drop Row 在 Pandas 中不可下标
- environment-variables - 如何在 Geoserver 中更改系统变量
- haskell - 可存储类型的确切标准是什么?
- python - 为什么创建自定义 sklearn Estimator 分数会下降?
- yocto - Jetson Nano 上的 Rauc 和 Yocto - 找不到主引导槽
- regex - regex-urlfilter.txt 文件中的 Apache Nutch url
- oracle - SqlLoader 中的提交点,使用的行不起作用
- csv - 计算 PySpark DataFrame 中元素的出现次数