обновление is_pending сбой для устройства Samsung в Android 11

#android #samsung-mobile #android-10.0 #android-11 #scoped-storage

#Android #samsung-мобильный #android-10.0 #android-11 #область действия-хранилище

Вопрос:

Я столкнулся со странным сбоем только на устройстве Samsung.

Смотрите Трассировку стека ниже,

 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. Это тоже только на устройстве Samsung. Это тоже, когда трек, который я пытаюсь отредактировать, находится на SD-КАРТЕ.
  • Я пробовал с устройствами Android 11 pixel, и все работает нормально.
  • Дорожка, которую я пытаюсь отредактировать, находится на SdCard по адресу

/storage/3964-3431/Music/Bujji-MassTamilan.mp3

  • Я не понимаю, почему при обновлении IS_PENDING до 1 на устройстве samsung android 11 корневое расположение носителя меняется на внутреннее хранилище

/storage/emulated/0/Music/...

Резюме — приложение вылетает только на устройстве Samsung Android 11, когда медиафайл поступает с SD-карты.

Комментарии:

1. Вы делаете все это без какого-либо кода?

2. @blackapps проверьте обновленный пост.

3. Не создавайте uri с помощью ContentUris.withAppendedId, а используйте uri, который вы получили ранее с помощью .insert() . Самое меньшее, что вы могли бы сделать, это проверить, совпадают ли они.

4. @blackapps о каком .insert() вы говорите? Носитель уже установлен на устройстве, и я получаю все носители с помощью MediaStore, а затем с помощью _ID пытаюсь получить uri.

5. Summary - App crashes Вы могли бы лучше назвать исключение, поскольку оно более информативно. И если вы поймаете это исключение, ваше приложение не выйдет из строя, но исключение все равно будет сгенерировано.