#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
Вы могли бы лучше назвать исключение, поскольку оно более информативно. И если вы поймаете это исключение, ваше приложение не выйдет из строя, но исключение все равно будет сгенерировано.