4

我只在三星设备中遇到了奇怪的崩溃。

请参阅下面的堆栈跟踪,

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 设备中崩溃。

4

0 回答 0