#java #android #scoped-storage
Вопрос:
Я хочу удалить все видеофайлы из одной конкретной папки, я знаю, что Android 11 использовал хранилище с областью действия, поэтому, если мое приложение не создает эти файлы, мне нужно запросить разрешение.
что я сделал, так это нашел в Интернете пример, в котором показано, как удалять файлы в хранилище с ограниченной областью. Во всех этих примерах есть такой тип запроса на удаление кода -gt; создает исключение (безопасность) — gt; gt; crateDeleteRequest -gt;gt;gt; если пользователь позволяет -gt;gt;gt;gt; затем удалите файлы
ContentResolver contentResolver = requireActivity().getContentResolver(); try { //delete object using resolver "Here!!!!!!!!!" contentResolver.delete(uri, null, null); } catch (SecurityException e) { PendingIntent pendingIntent = null; ArrayListlt;Urigt; collection = new ArrayListlt;gt;(); collection.add(uri); pendingIntent = MediaStore.createDeleteRequest(contentResolver, collection); if (pendingIntent != null) { IntentSender sender = pendingIntent.getIntentSender(); IntentSenderRequest request = new IntentSenderRequest.Builder(sender).build(); launcher.launch(request); } }
Приведенный выше код принимает в качестве параметра только «один uri видео» и запрашивает у пользователя разрешение на его удаление. Я хочу удалить несколько файлов, чтобы я написал этот запрос
ContentResolver resolver = requireActivity().getContentResolver(); // URI of the image to remove. Uri uriCollection; if (Build.VERSION.SDK_INT gt;= Build.VERSION_CODES.Q) { uriCollection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL); } else { uriCollection = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } // WHERE clause. String selection = MediaStore.Video.Media.BUCKET_ID " = ? "; String[] selectionArgs = new String[]{String.valueOf(videoFolder.getId())}; // Perform the actual removal. int numVideoFilesRemoved = 0; try { numVideoFilesRemoved = resolver.delete( uriCollection, selection, selectionArgs); }
Приведенный выше код принимает модель видеозаполнителя в качестве параметра и извлекает из нее идентификатор bucket_id для этой папки и удаляет все записи из хранилища мультимедиа с тем же идентификатором, предполагается, что он работает, но он не работает и возвращает только 0 (в «numVideoFilesRemoved» означает, что запись не удалена) и не создает восстанавливаемое исключение безопасности, которое является моей проблемой. я попробовал тот же код выше в Android 5,6,9. все они работают нормально, кроме 10 и 11