Удалить файл в Android, если у вас есть путь к форме `/storage/1018-2710/Pictures/oLvCVPZrNxk.jpg `

#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();
    }
  

Надеюсь, это кому-то поможет