Search code examples
androidandroid-gallerymediastore

How to combine multiple Uri from Images


I have this function that queries the gallery images

public void getImagesFromGallary(Context context) {

        List<Uri> imagesUri = new ArrayList<>();
    List<Uri> imageOrientationUri  = new ArrayList<>();


        Cursor imageCursor = null;
        try {
            final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.ImageColumns.ORIENTATION};
            final String orderBy = MediaStore.Images.Media.DATE_ADDED + " DESC";


            imageCursor = context.getApplicationContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy);
            while (imageCursor.moveToNext()) {
                Uri uri = Uri.parse(imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)));
                Uri uriOrientation = Uri.parse(imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION)));
                imagesUri.add(uri);
                imageOrientationUri.add(uriOrientation);

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (imageCursor != null && !imageCursor.isClosed()) {
                imageCursor.close();
            }
        }
    }

Do I have to have two Uri list for this, for instance I have a

imagesUri list and a imageOrientationUri list.

What if I want more information from the Image do I have to parse another Uri from the cursor?


Solution

  • You can create an object for the image like:

    public class ImageDetails {
    
        private URI imageURI;
        private URI imageOrientationURI;
    
        public URI getImageURI() {
            return imageURI;
        }
    
        public void setImageURI(URI imageURI) {
            this.imageURI = imageURI;
        }
    
        public URI getImageOrientationURI() {
            return imageOrientationURI;
        }
    
        public void setImageOrientationURI(URI imageOrientationURI) {
            this.imageOrientationURI = imageOrientationURI;
        }
    }
    

    And you create a single list and add details to it like:

    public void getImagesFromGallary(Context context) {
    
        List<ImageDetails> imageDetails = new ArrayList<>();
    
        Cursor imageCursor = null;
        try {
            final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.ImageColumns.ORIENTATION};
            final String orderBy = MediaStore.Images.Media.DATE_ADDED + " DESC";
    
            imageCursor = context.getApplicationContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy);
            while (imageCursor.moveToNext()) {
                ImageDetails tmp = new ImageDetails();
                tmp.setImageURI(Uri.parse(imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION))));
                tmp.setImageOrientationURI(Uri.parse(imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA))));
    
                imageDetails.add(tmp);
    
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (imageCursor != null && !imageCursor.isClosed()) {
                imageCursor.close();
            }
    }
    

    So for each new property now, you can create a new variable in the class along with the getters and setters