如何解决使用Mediastore API保存音频文件会在API 28-上引发RemoteException
我没有找到任何官方文档来说明如何使用MediaStore API将音频文件保存在外部存储中。 在API 29+上,一切正常。在API 28上,我收到此错误:
E/JavaBinder: *** Uncaught remote exception! (Exceptions are not yet supported across processes.)
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:2036)
at com.android.providers.media.MediaProvider.insertFile(MediaProvider.java:2188)
at com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:2592)
at com.android.providers.media.MediaProvider.insert(MediaProvider.java:1872)
at android.content.ContentProvider$Transport.insert(ContentProvider.java:266)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:152)
at android.os.Binder.execTransact(Binder.java:731)
这是我使用的代码(当我叫“插入”时,我得到一个空的Uri):
//@RequiresApi(VERSION_CODES.Q)
@SuppressLint("InlinedApi")
private fun export(name: String,path: String) {
val resolver = applicationContext.contentResolver
val audioCollection = if (VERSION.SDK_INT >= VERSION_CODES.Q) {
MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
} else {
MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
}
val newAudioFileDetails = ContentValues().apply {
put(MediaStore.Audio.Media.DISPLAY_NAME,name)
put(MediaStore.Audio.Media.DATA,"data")
put(MediaStore.Audio.Media.IS_PENDING,1)
}
val recordingUri = resolver.insert(audioCollection,newAudioFileDetails)
Log.d(TAG,"recording Uri: ${recordingUri.toString()}")
recordingUri?.let { recordingUri ->
resolver.openFileDescriptor(recordingUri,"w")?.use {
val bytesCopied = File(path).inputStream().copyTo(FileOutputStream(it.fileDescriptor))
Log.d("TAG","bytes copied: $bytesCopied")
}
newAudioFileDetails.let {
it.clear()
it.put(MediaStore.Audio.Media.IS_PENDING,0)
resolver.update(recordingUri,it,null,null)
}
}
}
编辑 我也尝试过这样做,但是插入时我总是得到一个空的Uri:
val newAudioFileDetails = ContentValues().apply {
put(MediaStore.Audio.Media.DISPLAY_NAME,name)
put(MediaStore.Audio.Media.IS_PENDING,1)
if (VERSION.SDK_INT < VERSION_CODES.Q) {
val audioDir = File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MUSIC),"MyNewAlbumName")
val audioPath = File(audioDir,"$name.mp3").absolutePath
put(MediaStore.Audio.AudioColumns.DATA,audioPath)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。