Ошибка при удалении файла в Android 11
Пытаюсь удалить файлы(фотографии, видео, аудио), приложение вылетает, ему не нравится мой Uri.
Код:
if (Build.VERSION.SDK_INT >= 30) {
val collection: ArrayList<Uri> = ArrayList()
for (i in 0 until Params.dataListPath.size) {
collection.add(Params.dataListPath[i].file.path.toUri())
Log.d(TAG, "onShowDialogConfirmDelete: " + collection[i].path)
}
val pendingIntent = MediaStore.createDeleteRequest(requireActivity().contentResolver, collection).intentSender
startIntentSenderForResult(pendingIntent, 100, null, 0, 0, 0, null)
}
logs:
java.lang.IllegalArgumentException: All requested items must be referenced by specific ID
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
at android.content.ContentProviderProxy.call(ContentProviderNative.java:732)
at android.content.ContentResolver.call(ContentResolver.java:2433)
at android.provider.MediaStore.createRequest(MediaStore.java:834)
at android.provider.MediaStore.createDeleteRequest(MediaStore.java:997)
at com.test.cleanerapp.duplicate_files.view.fragment.DuplicateFindFragment.onShowDialogConfirmDelete(DuplicateFindFragment.kt:119)
Ответы (1 шт):
Автор решения: Armenak Mkhitaryan
→ Ссылка
Все что надо было - это из File.path получить приемлемый путь для MediaStore. Если кому надо будет:
Метод, который делает необходимое преобразование:
private fun onGetFilePathToMediaID(songPath: String, context: Context): Long {
var id: Long = 0
val cr: ContentResolver = context.getContentResolver()
val uri = MediaStore.Files.getContentUri("external")
val selection = MediaStore.Audio.Media.DATA
val selectionArgs = arrayOf(songPath)
val projection = arrayOf(MediaStore.Audio.Media._ID)
val sortOrder = MediaStore.Audio.Media.TITLE + " ASC"
val cursor: Cursor? = cr.query(uri, projection, "$selection=?", selectionArgs, null)
if (cursor != null) {
while (cursor.moveToNext()) {
val idIndex: Int = cursor.getColumnIndex(MediaStore.Audio.Media._ID)
id = cursor.getString(idIndex).toLong()
}
}
return id
}
Соотвественно мой код изменился следующим образом:
val collectionPhoto: ArrayList<Uri> = ArrayList()
val collectionVideo: ArrayList<Uri> = ArrayList()
val collectionAudio: ArrayList<Uri> = ArrayList()
var mediaID: Long = 0
if (Build.VERSION.SDK_INT >= 30) {
for (i in 0 until Params.dataListPath.size) {
mediaID = onGetFilePathToMediaID(Params.dataListPath[i].file.absolutePath, requireActivity())
when (Params.dataListPath[i].typeFile) {
FileType.VIDEO -> {
val uriVideo = ContentUris.withAppendedId(MediaStore.Video.Media.getContentUri("external"), mediaID)
collectionVideo.add(uriVideo)
}
FileType.PHOTO -> {
val uriPhoto = ContentUris.withAppendedId(MediaStore.Images.Media.getContentUri("external"), mediaID)
collectionPhoto.add(uriPhoto)
}
FileType.AUDIO -> {
val uriAudio = ContentUris.withAppendedId(MediaStore.Audio.Media.getContentUri("external"), mediaID)
collectionAudio.add(uriAudio)
}
}
}
val pendingIntent = MediaStore.createDeleteRequest(requireActivity().contentResolver, collectionPhoto).intentSender
startIntentSenderForResult(pendingIntent, 100, null, 0, 0, 0, null)
}