#java #android #android-fragments #mediastore #android-storage
#java #Android #android-фрагменты #mediastore #android-хранилище
Вопрос:
Итак, я пытаюсь удалить файл из внешнего хранилища Android, проблема в том, что я несколько раз пытался получить путь несколькими различными способами. Используя MediaStore Api, я подошел очень близко, но не могу понять, как это сделать. Я не могу получить EXTERNAL_URI
, потому что для проекции требуются строки, а EXTERNAL_URI
в MediaStore возвращается URI, а не строка.
Вот как я загружаю изображения, класс GalleryImage просто содержит, путь к файлу /storage/1018-2710/Pictures/oLvCVPZrNxk.jpg
и некоторые логические значения для обработки выбора. Я попытался добавить внешний URI, но не смог этого сделать.
public class ImageLoader {
public ArrayList<GalleryImage> getAllShownImagesPath(Context context) {
Uri uri;
Cursor cursor;
int column_index_data, column_index_folder_name, column_index_content_uri;
ArrayList<GalleryImage> listOfAllImages = new ArrayList<GalleryImage>();
String absolutePathOfImage = null;
uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = { MediaStore.MediaColumns.DATA,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
};
cursor = context.getContentResolver().query(uri, projection, null,
null, null);
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA);
column_index_folder_name = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
while (cursor.moveToNext()) {
absolutePathOfImage = cursor.getString(column_index_data);
// String externalURI = cursor.getString();
String externalURI = ""; //empty, beacuse I couldnt get it to work...
listOfAllImages.add(new GalleryImage(false, false , absolutePathOfImage, externalURI));
}
cursor.close();
return listOfAllImages;
}
}
И здесь, в моем фрагменте, я пытаюсь удалить изображения
if(item.getItemId() == R.id.delete_selected){
//Uri root = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String root = Environment.getExternalStorageDirectory().toString();
for(GalleryImage i : mViewModel.selectedImages){
File file = new File(root i.getmImageUrl());
if (file.exists()) {
if (file.delete()) {
System.out.println("file Deleted :" file.getPath());
} else {
System.out.println("file not Deleted :" file.getPath());
}
}
}
}
Я перепробовал около 4,5 различных комбинаций, но ни одна из них, похоже, не сработала, я пытаюсь получить правильный путь к изображению, я увидел, что, возможно, использование EXTERNAL_URI
было бы правильным решением, но я не знаю, как поместить его в свой GalleryImage. Любая помощь приветствуется!
Комментарии:
1. вы добавили разрешение во время выполнения? и какой API вы используете?
2. Пожалуйста, сообщите версию компиляции и целевой версии и версию используемого устройства Android.
3. Как вы получили тот путь, о котором вы говорите с самого начала?
4.
String externalURI = ""; //empty, beacuse I couldnt get it to work...
Ну, заставьте его работать, так как это uri, который вы также должны использовать для удаления файла из media Store.5.
File file = new File(root i.getmImageUrl());
Пожалуйста, укажите значениеfile.getAbsolutePath()
для некоторых изображений.
Ответ №1:
public void deleteSelectedImages(){
for(GalleryImage img : selectedImages){
File file = new File(img.getmImageUrl());
if(!file.exists()) {
return;
}
String canonicalPath;
ContentResolver contentResolver = getApplication().getContentResolver();
try {
canonicalPath = file.getCanonicalPath();
} catch (IOException e) {
canonicalPath = file.getAbsolutePath();
}
final Uri uri = MediaStore.Files.getContentUri("external");
final int result = contentResolver.delete(uri,
MediaStore.Files.FileColumns.DATA "=?", new String[]{canonicalPath});
if (result == 0) {
final String absolutePath = file.getAbsolutePath();
if (!absolutePath.equals(canonicalPath)) {
contentResolver.delete(uri,
MediaStore.Files.FileColumns.DATA "=?", new String[]{absolutePath});
}
}
images.remove(img);
}
imagesLiveData.setValue(images);
selectedImages.clear();
Toast.makeText(getApplication().getApplicationContext(), "Succesfully deleted image(s)", Toast.LENGTH_SHORT).show();
}
Надеюсь, это кому-то поможет