Я нашел эту тему в переполнении стека. Я попробовал первый ответ . Это не сработало. Фотографии все еще находятся в приложении «Фотографии» телефона после того, как delete () вернет true. Я пытался этот второй ответ . Тоже не сработало.
Тогда я попытался этот третий ответ .
Вот мой код после некоторой адаптации третьего ответа. imagesEncodedList - это ArrayList путей к файлам строк фотографий, которые я хочу удалить:
String[] selectionArgs = new String[imagesEncodedList.size()];
for(int i=0; i<imagesEncodedList.size();i++) {
selectionArgs[i]=imagesEncodedList.get(i);
}
//delete original
// Set up the projection (we only need the ID)
String[] projection = { MediaStore.Images.Media._ID };
// Match on the file path
String selection = MediaStore.Images.Media.DATA + " = ?";
// Query for the ID of the media matching the file path
Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver contentResolver = getContentResolver();
Cursor c = contentResolver.query(queryUri, projection, selection,
selectionArgs, null);
if (c.moveToFirst()) {
// We found the ID. Deleting the item via the content provider will also
remove the file
long id = c.getLong(c.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
Uri deleteUri =
ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
contentResolver.delete(deleteUri, null, null);
} else {
// File not found in media store DB
}
c.close();
Я не знаю, как работает contentResolver.query (). Я запустил свое приложение, и появляется сообщение об ошибке со ссылкой на строку, в которой был инициализирован курсор c:
Причина: java.lang.IllegalArgumentException: Невозможно связать аргумент в индексе 2, поскольку индекс выходит за пределы диапазона. Оператор имеет 1 параметр.
Какой аргумент находится в индексе 2? Что имеет только 1 параметр?