Android存储(MediaStore)

Android Storage(MediaStore)

提问人:Muhammad Awais Shan 提问时间:10/12/2023 更新时间:10/13/2023 访问量:43

问:

我正在尝试将音频文件从缓存保存到具有文件夹 Voice Changer 的音乐目录中

以下代码在 Android 10 及更高版本中运行良好 但低于它不起作用 我目前在 Android 8 中使用 MediaStore API 时面临挑战。此 API 用于管理 Android 应用程序中的图像和视频等媒体文件。具体来说,我在使用此 API 添加文件时遇到问题。在 Android 开发中,能够有效地处理媒体文件至关重要,但我在这个过程中遇到了障碍。 我试图深入研究这个问题,但到目前为止,我还没有找到解决方案。我正在探索不同的途径和故障排除方法,以查明问题并找到解决方案。我相信,只要再多努力一点,也许还有一些外部见解,我可以克服这个障碍,继续有效地进行我的 Android 开发项目

suspend fun String.saveAudioToGallery(
    context: Context, mimeType: String = "audio/x-wav", done: (String?) -> Unit, error: () -> Unit
) = withContext(Dispatchers.IO) {
    var savedPath: String? = null
    val contentValues = ContentValues().apply {
        put(MediaStore.Audio.Media.DISPLAY_NAME, "Vc_${System.currentTimeMillis()}.wav")
        put(MediaStore.Audio.Media.MIME_TYPE, mimeType)
        put(MediaStore.Audio.Media.DATE_ADDED, System.currentTimeMillis() / 1000)
    }
    val collection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        contentValues.put(
            MediaStore.Audio.Media.RELATIVE_PATH,
            "${Environment.DIRECTORY_MUSIC}/VoiceChanger"
        )
        MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
    } else {
        val directory =
            File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).absolutePath,"VoiceChanger")
        if (!directory.exists()){
            directory.mkdirs()
        }
        contentValues.put(MediaStore.Audio.Media.DATA, directory.absolutePath)
        MediaStore.Audio.Media.getContentUri(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI.toString())
    }
    val contentResolver = context.contentResolver

    try {
        // Insert the audio file into the MediaStore and get the URI
        val audioUri = contentResolver.insert(collection, contentValues)
        Log.d("inputStram", "saveAudioToGalleryUri:$audioUri ")


        audioUri?.let { uri ->
            // Open an output stream using the ContentResolver
            contentResolver.openOutputStream(uri)?.use { os ->
                // Open input stream from the file path
                val file = File(this@saveAudioToGallery)
                val inputStream = FileInputStream(file)
                // Write audio data to the output stream
                inputStream.copyTo(os)
                Log.d("inputStram", "saveAudioToGallery:$savedPath ")
                savedPath = file.absolutePath // Save the file path for later use
                Log.d("inputStram", "saveAudioToGallery:$savedPath ")
                os.close()
                inputStream.close()
            }
        }
    } catch (e: Exception) {
        // Handle exceptions
        Log.e("TAG", "saveAudioToGallery: ${e.message}")
    }

    withContext(Dispatchers.Main) {
        if (savedPath != null) {
            Log.d("TAGGing", "saveAudioToGallery:$savedPath ")
            done.invoke(savedPath)
        } else {
            Toast.makeText(context.applicationContext, "Failed to save audio to gallery", Toast.LENGTH_SHORT).show()
            error.invoke()
        }
    }
}
Android Kotlin 文件 MediaStore android-storage

评论

0赞 blackapps 10/12/2023
究竟什么不起作用?你现在让我们猜猜。
0赞 blackapps 10/12/2023
if (!directory.exists()){ if(!directory.mkdirs()) return;也显示 Toast 以通知用户。
0赞 blackapps 10/12/2023
MediaStore.Audio.Media.DATA, directory.absolutePath)认为 .DATA 列需要新文件的完整路径。不仅是目录的完整路径。
0赞 Muhammad Awais Shan 10/13/2023
@blackapps在android中低于10 dir,然后文件不存储在名为Voice changer的文件夹中,audioUri始终返回null问题,resolver.insert(collection,contentValues)
0赞 blackapps 10/13/2023
你没有对我所说的.DATA 列。

答:

0赞 blackapps 10/13/2023 #1

对于低于 10 的集合,您使用不可能的集合,这会导致您未告知我们的异常。

此外,您应该给 .DATA 列文件的完整路径。不仅是目录的完整路径。