В Android 10 есть два способа сделать это, в зависимости от значения android:requestLegacyExternalStorage
в AndroidManifest.xml
файле приложения.
Вариант 1: объем хранилища включен (android:requestLegacyExternalStorage="false"
)
Если ваше приложение добавило содержимое для начала (с использованием contentResolver.insert
), то метод выше (с использованием contentResolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, whereClause, idsArray)
) должен работать. В Android 10 любым контентом, отправленным в магазин мультимедиа приложением, можно свободно управлять с помощью этого приложения.
Для контента, добавленного пользователем или принадлежащего другому приложению, процесс немного сложнее.
Чтобы удалить отдельный элемент из хранилища мультимедиа, не передавайте общий URI хранилища мультимедиа в delete
(т. Е. MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
), а используйте конкретный URI элемента.
context.contentResolver.delete(
audioContentUri,
"${MediaStore.Audio.Media._ID} = ?",
arrayOf(audioContentId)
(Я почти уверен, что здесь нет необходимости в предложении 'where', но для меня это имело смысл :)
На Android 10 это, скорее всего, выдаст RecoverableSecurityException
, если ваш targetSdkVersion
> = 29. Внутри этого исключения находится IntentSender
, который может быть запущен вашим Activity
, чтобы запросить у пользователя разрешение на его изменение или удаление. (Отправитель находится в recoverableSecurityException.userAction.actionIntent.intentSender
)
Поскольку пользователь должен предоставить разрешение на каждый элемент, их невозможно удалить массово. (Или, вероятно, можно запросить разрешение на изменение или удаление всего альбома, по одной песне за раз, а затем использовать delete
запрос, который вы использовали выше. В этот момент ваше приложение будет иметь разрешение на их удаление, и Media Store сделает все сразу. Но сначала нужно попросить каждую песню.)
Вариант 2: старое хранилище включено (android:requestLegacyExternalStorage="true"
)
В этом случае простой вызов contentResolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, whereClause, idsArray)
не только удаляет элементы из базы данных, но также удаляет файлы.
Приложение должно иметь WRITE_EXTERNAL_STORAGE
разрешение, чтобы это работало, но я проверил код, который вы указали в вопросе, и убедился, что файлы также были удалены.
Итак, для более старых версий API, я думаю, вам нужно использовать contentResolver.delete
и самостоятельно отсоединить файл (или отсоединить файл и отправить запрос на его повторное сканирование через MediaScannerConnection
).
Для Android 10+ contentResolver.delete
удалит как индекс, так и само содержимое.
person
Nicole Borrelli
schedule
10.10.2019
(that were copied to the device from USB) from the external storage.
Неясно, где эти файлы должны находиться после копирования. Вы имели ввиду ДО внешнее хранилище? Где именно? И от USB тоже непонятно, пока не объяснишь как именно. - person blackapps   schedule 08.10.2019/storage/emulated/0/Music
. Я хочу программно удалить их из своего приложения. Я отредактировал вопрос, чтобы было понятнее. - person Thibault Seisel   schedule 08.10.2019/storage/emulated/0/Music
, вы, безусловно, можете удалить их самостоятельно. Зачем возиться с MediaStore? - person blackapps   schedule 08.10.2019/storage/emulated/0/Music
. Что ж, если это так, то вы «видели» эту папку и можете снова удалить эти файлы. Пожалуйста, дополните. - person blackapps   schedule 08.10.2019