媒体不允许下载主目录

Primary directory Download not allowed for media

尝试将 PDF 文件保存在下载目录中,但在 getExternalStoragePublicDirectory 在 Android Q 之后完全弃用后,无法将文件保存在 DCIM 或图片文件夹以外的任何其他位置,因为尝试在此处保存文件时抛出以下异常。

IllegalArgumentException: Primary directory Download not allowed for content://media/external/images/media; allowed directories are [DCIM, Pictures]

有如下代码。

private fun saveFile(input: ByteArray) {
    val fileName = "myFile.pdf"
    val outputStream = if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.Q) {
        val directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
        val file = File(directory, fileName)
        FileOutputStream(file)
    } else {
        val resolver = context.contentResolver
        val contentValues = ContentValues().apply {
            put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
            put(MediaStore.MediaColumns.MIME_TYPE, "images/*")
            put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
        }
        resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)?.let {
            resolver.openOutputStream(it)
        }
    }
    outputStream?.use { stream ->
        stream.write(input)
    }
}

显然,当将路径更改为 DIRECTORY_DCIM 时,一切都按预期进行,但由于要求,文件应像以前一样保存到下载。 非常感谢任何帮助。

没有为文件保存设置正确的 URI,对于下载它应该是

resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues)

blackapps感谢指点

在 Android 11 日,应用程序无法再访问外部存储中任何其他应用程序专用的、特定于应用程序的目录中的文件。为了保护用户隐私,在 运行 Android 11 或更高版本的设备上,系统进一步限制您的应用访问其他应用的私有目录。

请求MANAGE_EXTERNAL_STORAGE许可

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage"/>