首页 > 解决方案 > Android Q - 如何获取外部 SD 卡公共下载目录路径

问题描述

如果我理解正确,在 Android Q 中,您的应用程序可以使用 api 在不可移动存储上读取/写入下载目录:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) 

这转化为

 /storage/emulated/0/Downloads

或可移动存储上的公共下载目录(Android Q 中的新功能),即

/storage/08E7-324HI/Downloads

如何使用 API 获取第二个目录?

标签: androidandroid-10.0

解决方案


实际上是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开发人员指南,以类似方式了解如何创建、编辑或删除文件。


推荐阅读