我只在三星设备中遇到了奇怪的崩溃。
请参阅下面的堆栈跟踪,
Fatal Exception: com.pilabs.musicplayer.tageditor.TagEditFailedException: Tag edit failed : Changing volume from /storage/3964-3431/Music/Bujji-MassTamilan.io.mp3 to /storage/emulated/0/Music/.pending-1608532169-Bujji-MassTamilan.io.mp3 not allowed
at com.pilabs.musicplayer.tageditor.PiTagEditor.handleException(PiTagEditor.java:643)
at com.pilabs.musicplayer.tageditor.PiTagEditor.editTrackTagInfoImpl(PiTagEditor.java:217)
at com.pilabs.musicplayer.tageditor.PiTagEditor.access$setUiCallback$p(PiTagEditor.java:37)
at com.pilabs.musicplayer.tageditor.PiTagEditor$editTrackTagInfo$1.invokeSuspend(PiTagEditor.java:79)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(BaseContinuationImpl.java:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.java:238)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.java:594)
at kotlinx.coroutines.scheduling.CoroutineScheduler.access$createdWorkers(CoroutineScheduler.java:60)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.java:742)
TagEditFailedException
我自己的书面例外在哪里。实际的例外是,
java.lang.IllegalArgumentException: Changing volume from /storage/3964-3431/Music/Bujji-MassTamilan.io.mp3 to /storage/emulated/0/Music/.pending-1608532169-Bujji-MassTamilan.io.mp3 not allowed
最重要的是,寻找
Changing volume from /storage/3964-3431/Music/Bujji-MassTamilan.io.mp3 to /storage/emulated/0/Music/.pending-1608532169-Bujji-MassTamilan.io.mp3 not allowed
我调试了代码,发现在更新其他元数据之前更新 IS_PENDING 时应用程序崩溃了。
private fun updateNameChangesInAndroidDb(application: Application, editTrackTagInfo: EditTrackTagInfo) {
val uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
editTrackTagInfo.trackId.toLong())
val contentValues = ContentValues()
if (hasQ()) {
contentValues.put(MediaStore.Audio.Media.IS_PENDING, 1)
application.contentResolver.update(uri, contentValues, null, null)
}
contentValues.clear()
if (hasQ())
contentValues.put(MediaStore.Audio.Media.IS_PENDING, 0)
with(editTrackTagInfo) {
title?.let { it -> contentValues.put(MediaStore.Audio.Media.TITLE, it) }
album?.let { it -> contentValues.put(MediaStore.Audio.Media.ALBUM, it) }
artist?.let { it -> contentValues.put(MediaStore.Audio.Media.ARTIST, it) }
}
val rowsUpdated = application.contentResolver.update(uri, contentValues,
null, null)
应用程序崩溃
application.contentResolver.update(uri, contentValues, null, null)
在将 IS_PENDING 更新为 1 时
if (hasQ()) {
contentValues.put(MediaStore.Audio.Media.IS_PENDING, 1)
application.contentResolver.update(uri, contentValues, null, null)
}
我不明白为什么更新 is_pending 会将卷从 SD_Card 更改为内部存储 (/storage/emulated/0...)。
- 应用程序仅在 Android 11 设备上崩溃。仅在三星设备上也是如此。当我尝试编辑的曲目来自 SD-CARD 时也是如此。
- 我尝试过使用 Android 11 像素设备,它运行良好。
- 我正在尝试编辑的曲目位于 SdCard 中
/storage/3964-3431/Music/Bujji-MassTamilan.mp3
- 我不明白为什么在三星 android 11 设备中将 IS_PENDING 更新为 1 时,媒体的根位置更改为内部存储
/storage/emulated/0/Music/...
摘要 - 当媒体文件来自 SD 卡时,应用程序仅在 Android 11 Samsung 设备中崩溃。