在 Android 30 中对 public 文件夹使用 `FileProvider.getUriForFile` 会抛出 `Failed to find configured root`

Using `FileProvider.getUriForFile` in Android 30 for public folder throws `Failed to find configured root`

我正在使用以下代码将文件保存到 public 下载文件夹。

val resolver = this.contentResolver
val contentValues = ContentValues().apply {
    put(MediaStore.Files.FileColumns.DISPLAY_NAME, "$fileName.pdf")
    put(MediaStore.Files.FileColumns.MIME_TYPE, "application/pdf")
    put(
        MediaStore.Files.FileColumns.RELATIVE_PATH,
        Environment.DIRECTORY_DOWNLOADS
        )
    }
val uri = resolver.insert(
                          MediaStore.Downloads.EXTERNAL_CONTENT_URI,
                          contentValues
                  )

val fos = this.contentResolver.openOutputStream(uri!!)
fos?.write(fileContent)
fos?.flush()
fos?.close()
val uriString = uri.toString()
return uriString

我正在尝试向用户显示通知并添加 Intent 以打开下载的文件。我使用从保存文档代码传递过来的 uriString。

var uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", File(uriString))
val intent = Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "application/pdf")

此代码在 Android Pie 之前工作正常。但在 Android 30 上失败,出现以下异常。

Failed to handle method call
    java.lang.IllegalArgumentException: Failed to find configured root that contains /content:/media/external/downloads/36
        at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile

如果您已有一个 uri,请不要尝试建立一个新的 uri。

无需使用 FileProvider。

使用 val uri,因为它是文件的 uri。

在使用的意图上额外放置一个读取标志。