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