提问人:Muhammad Awais Shan 提问时间:10/12/2023 更新时间:10/13/2023 访问量:43
Android存储(MediaStore)
Android Storage(MediaStore)
问:
我正在尝试将音频文件从缓存保存到具有文件夹 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()
}
}
}
答:
0赞
blackapps
10/13/2023
#1
对于低于 10 的集合,您使用不可能的集合,这会导致您未告知我们的异常。
此外,您应该给 .DATA 列文件的完整路径。不仅是目录的完整路径。
评论
MediaStore.Audio.Media.DATA, directory.absolutePath)
认为 .DATA 列需要新文件的完整路径。不仅是目录的完整路径。