OberDulli94
OberDulli94

Reputation: 187

Android get all folders that contain at least one media file like photo / video

I just need the path of folders that contain at least one file that ends with eg. .mp4 or .jpg . I already checked this thread: Android: how to get all folders with photos? but it's too slow for my use case. Is there a faster way to do that?

Upvotes: 1

Views: 1986

Answers (1)

OberDulli94
OberDulli94

Reputation: 187

So I finally found a solution which is way faster than the mentioned above. I got all directories with images within ~100-150ms (around 3k files). In the example below all image files stored either on the internal or external storage gets checked and the parent directory is added to the array list. I excluded .gif and .giff files. This method also works with videos therefore a few steps are required:

  • change queryUri to MediaStore.Video.Media.EXTERNAL_CONTENT_URI
  • change projection to MediaStore.Video.Media.DATA
  • change 'image/%' in includeImages to 'video/%'
  • delete + excludeGif from selection

public static ArrayList<String> getImageDirectories(Context mContext) {
        ArrayList<String> directories = new ArrayList<>();

        ContentResolver contentResolver = mContext.getContentResolver();
        Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;


        String[] projection = new String[]{
                MediaStore.Images.Media.DATA
        };

        String includeImages = MediaStore.Images.Media.MIME_TYPE + " LIKE 'image/%' ";
        String excludeGif =  " AND " + MediaStore.Images.Media.MIME_TYPE + " != 'image/gif' " + " AND " + MediaStore.Images.Media.MIME_TYPE + " != 'image/giff' ";
        String selection =  includeImages + excludeGif;

        Cursor cursor = contentResolver.query(queryUri, projection, selection, null, null);

        if (cursor != null && cursor.moveToFirst()) {
            do {

                String photoUri = cursor.getString(cursor.getColumnIndex(projection[0]));
                if(!directories.contains(new File(photoUri).getParent())){
                    directories.add(new File(photoUri).getParent());
                }

            } while (cursor.moveToNext());
        }

        return directories;
    }

Upvotes: 1

Related Questions