在运行 Android 10 以下的设备上将文件保存到 MediaStore

Ole*_*ych 5 audio android download mediastore mime-types

我正在编写用于下载和存储不同类型的 MediaStore 文件的代码。对于运行 Android 10 及更高版本的设备,我将它们全部存储到Downloads集合中,并且工作正常。运行 Android 10 以下的用户没有此集合。一开始我尝试将它们存储到Files集合中,但事实证明不可能将例如图像存储到Files集合中。所以我来到了这段代码:

fun createDownloadsFile(context: Context, fileName: String, mimeType: String): Uri? {
    val values = ContentValues().apply {
        put(MediaStore.MediaColumns.DISPLAY_NAME, fileName)
        put(MediaStore.MediaColumns.MIME_TYPE, mimeType)
    }
    val collection = if (hasAndroid10()) {
        values.put(MediaStore.MediaColumns.IS_PENDING, 1)
        MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
    } else getMediaStoreCollectionBelowAndroid10(mimeType)

    return context.contentResolver.insert(collection, values)
}

private fun getMediaStoreCollectionBelowAndroid10(mimeType: String): Uri = when {
    mimeType.startsWith("image/") -> MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
    mimeType.startsWith("audio/") -> MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
    mimeType.startsWith("video/") -> MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
    else -> MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL)
}
Run Code Online (Sandbox Code Playgroud)

现在,图像和视频在低于 10 的 Android 上可以正常存储。但尝试存储音频时会崩溃contentResolver.insert(collection, values)java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.lastIndexOf(int)' on a null对象引用

尝试在同一行上存储与图像、视频和音频不同类型的文件会崩溃: java.lang.IllegalArgumentException:插入新文件时未提供路径

我将不胜感激任何帮助!