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

将文件保存到运行Android 10以下版本的设备上的MediaStore,android,audio,download,mime-types,mediastore,Android,Audio,Download,Mime Types,Mediastore,我正在编写代码,用于下载和存储不同类型的MediaStore文件。对于运行安卓10和更高版本的设备,我将它们全部存储到下载集集合中,并且工作正常。那些运行低于10的Android的用户没有这个集合。起初,我试图将它们存储到文件集合中,但结果是无法将例如图像存储到文件集合中。因此,我得出了以下代码: fun createDownloadsFile(context: Context, fileName: String, mimeType: String): Uri? { val values

我正在编写代码,用于下载和存储不同类型的MediaStore文件。对于运行安卓10和更高版本的设备,我将它们全部存储到
下载集
集合中,并且工作正常。那些运行低于10的Android的用户没有这个集合。起初,我试图将它们存储到
文件
集合中,但结果是无法将例如图像存储到
文件
集合中。因此,我得出了以下代码:

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)
}
图像和视频现在可以在10岁以下的Android上正常存储。但尝试将音频崩溃存储在线路
contentResolver.insert(集合,值)
上,使用: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int java.lang.String.lastIndexOf(int)”

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


我将感谢任何帮助

使用.DATA列指示文件应存储的位置。但是对于低于Android 10的用户,使用媒体存储是没有意义的。@blackapps使用如下数据:对于音频/*mimeType和除图像/*和视频/*之外的所有mimeType?您不能将媒体存储用于外部文件目录。这是一个特定于应用程序的目录,媒体商店可以在其中不插手。您可以显示或链接一些代码示例来演示您的解决方案吗?@blackapps“但对于低于Android 10的用户,使用媒体商店是没有意义的”-我需要这些文件与其他应用程序一起打开。据我所知,如果我的应用程序目标API级别为30,那么其他应用程序将无法访问
文件://
Uri,即使该设备运行的Android低于10。对吗?使用.DATA列指示文件应存储的位置。但是对于低于Android 10的用户,使用媒体存储是没有意义的。@blackapps使用如下数据:对于音频/*mimeType和除图像/*和视频/*之外的所有mimeType?您不能将媒体存储用于外部文件目录。这是一个特定于应用程序的目录,媒体商店可以在其中不插手。您可以显示或链接一些代码示例来演示您的解决方案吗?@blackapps“但对于低于Android 10的用户,使用媒体商店是没有意义的”-我需要这些文件与其他应用程序一起打开。据我所知,如果我的应用程序目标API级别为30,那么其他应用程序将无法访问
文件://
Uri,即使该设备运行的Android低于10。对吗?