java.lang.IllegalArgumentException: на все запрошенные элементы необходимо ссылаться по определенному идентификатору (Android)

Я получаю это исключение при вызове MediaStore.createWriteRequest(contentResolver, uris). Как и в Anrdroid Q и выше, мы должны сделать createWriteRequest для записи в хранилище. Итак, я пробую следующий код и получаю исключение.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            List<Uri> uris = new ArrayList<>();
            uris.add(mediaUri);
            MediaStore.createWriteRequest(contentResolver, uris);
            //code
        }

person Feroz Khan    schedule 21.10.2020    source источник
comment
Так что такое mediaUri? Ссылается ли он на конкретный MediaStore элемент по идентификатору?   -  person ianhanniballake    schedule 22.10.2020
comment
Я инициализирую mediaUri как mediaUri = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);   -  person Feroz Khan    schedule 22.10.2020
comment
Вы не указываете, что следует писать. mediaUri обозначает площадь. Используйте appendedId, например final Uri contentUri = ContentUris.withAppendedId (Uri.parse (content: // downloads / public_downloads), Long.valueOf (id));   -  person Theo    schedule 22.10.2020
comment
Ваш трюк хорош, но я все еще получал то же исключение, но, используя ваш код, я изменил его, как final Uri contentUri = ContentUris.withAppendedId( MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY), Long.valueOf(id));, и ошибка исчезла. Спасибо   -  person Feroz Khan    schedule 22.10.2020


Ответы (1)


Ваш Uri-путь неверен, поэтому отображается сообщение об ошибке.

Недействительный путь Uri: content: //com.abc.photoapp.provider/external_files/emulated/0/Pictures/camara/1623819097267.jpg

Действительный путь: content: // media / external / images / media / 52703

Здесь я шаг за шагом объясню путь к файлу для удаления мультимедиа.

Шаг 1:

Предположим, у вас есть такой путь к файлу /storage/emulated/0/tempPic/export_image.jpg

File tempFile=new File("/storage/emulated/0/tempPic/export_image.jpg");
long mediaID=getFilePathToMediaID(tempFile.getAbsolutePath(),  context);

public long getFilePathToMediaID(String songPath, Context context)
{
        long id = 0;
        ContentResolver cr = context.getContentResolver();

        Uri uri = MediaStore.Files.getContentUri("external");
        String selection = MediaStore.Audio.Media.DATA;
        String[] selectionArgs = {songPath};
        String[] projection = {MediaStore.Audio.Media._ID};
        String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";

        Cursor cursor = cr.query(uri, projection, selection + "=?", selectionArgs, null);

        if (cursor != null) {
            while (cursor.moveToNext()) {
                int idIndex = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
                id = Long.parseLong(cursor.getString(idIndex));
            }
        }

        return id;
}

Шаг 2:

Создайте идентификатор мультимедиа для Uri

Uri Uri_one = ContentUris.withAppendedId( MediaStore.Images.Media.getContentUri("external"),mediaID);

// content://media/external/images/media/52703

Uri содержимого меняется в зависимости от типа файла:

Если изображение, то: MediaStore.Images.Media.getContentUri (внешний) Если видео, то: MediaStore.Video.Media.getContentUri (внешний)

Шаг 3:

Готовься и звони на удаление

List<Uri> uris=new ArrayList<>();
uris.add(<Add Paht : Uri_one >);
uris.add(<Add Paht : Uri_two >);
uris.add(<Add Paht : Uri_three >);

requestDeletePermission( context,uris);

введите здесь описание изображения После вызова метода спросите диалоговое окно разрешения. Метод requestDeletePermission возвращает результат по методу onActivityResult.

Вышеупомянутый метод поддерживает Android 11 (Target SDK версии 30) и более позднюю версию. Вам не требуется разрешение manage_external_storage для удаления медиафайлов. Вы можете использовать такие медиа, как видео, аудио и изображения.

Если вы хотите удалить файл документа, вам потребуется разрешение manage_external_storage.

person Jatin Borsaniya    schedule 22.06.2021