Android Q-如何获取外部SD卡公共下载目录路径

时间:2019-04-12 00:43:29

标签: android androidq

如果我理解正确,那么在Android Q中,您的应用可以使用api读取/写入非移动存储上的downloads目录:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) 

翻译为

 /storage/emulated/0/Downloads

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

/storage/08E7-324HI/Downloads

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

1 个答案:

答案 0 :(得分:0)

实际上不建议使用Environment.getExternalStorageDirectory()Environment. getExternalStoragePublicDirectory(String type)方法,并且在Android Q(或更高版本)设备上调用它们将返回空的File对象。

从下表中可以看出(摘自Android开发者文档here),现在访问“下载”目录的最佳方法是使用Storage Access Framework

Summary of how scoped storage affects file access

通过Storage Access Framework打开文件是一个两步过程。

首先,按如下所示激发启动系统文件选择器的意图:

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开发人员指南,以类似方式查看如何创建,编辑或删除文件。