For the purpose you will have to query the Media Store Content Provider. In my projects I use the following method to get the list with some other data associated with every image.
public static ArrayList<MediaStorePhoto> getAllPhotosFromExternalStorage(ContentResolver mContentResolver) {
MediaStorePhoto photo;
ArrayList<MediaStorePhoto> photoList = new ArrayList<>();
// which image properties are we querying
String[] projection = new String[]{
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATE_TAKEN,
MediaStore.Images.Media.SIZE,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATA
};
// content:// style URI for the "primary" external storage volume
Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
// Make the query.
Cursor cur = mContentResolver.query(images,
projection, // Which columns to return
null, // Which rows to return (all rows)
null, // Selection arguments (none)
null // Ordering
);
Log.i("ListingImages", " query count=" + cur.getCount());
if (cur.moveToFirst()) {
String bucketId;
long id;
long size;
String bucket;
String date;
String name;
String dataUri;
int bucketIdColumn = cur.getColumnIndex(
MediaStore.Images.Media.BUCKET_ID);
int idColumn = cur.getColumnIndex(
MediaStore.Images.Media._ID);
int bucketColumn = cur.getColumnIndex(
MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
int dateColumn = cur.getColumnIndex(
MediaStore.Images.Media.DATE_TAKEN);
int sizeColumn = cur.getColumnIndex(
MediaStore.Images.Media.SIZE);
int nameColumn = cur.getColumnIndex(
MediaStore.Images.Media.DISPLAY_NAME);
int dataColumn = cur.getColumnIndex(
MediaStore.Images.Media.DATA);
do {
// Get the field values
bucketId = cur.getString(bucketIdColumn);
bucket = cur.getString(bucketColumn);
date = cur.getString(dateColumn);
size = cur.getLong(sizeColumn);
id = cur.getLong(idColumn);
name = cur.getString(nameColumn);
dataUri = cur.getString(dataColumn);
// Store photo in Photo object
photo = new MediaStorePhoto(String.valueOf(id), name,
bucket, date, String.valueOf(size), "null", dataUri, bucketId);
// Add photo to photo list
photoList.add(photo);
} while (cur.moveToNext());
}
cur.close();
return photoList;
}
Note : Here MediaStorePhoto
is a class that I made something like
public class MediaStorePhoto implements Parcelable {
public static final Creator CREATOR = new Creator() {
public MediaStorePhoto createFromParcel(Parcel in) {
return new MediaStorePhoto(in);
}
public MediaStorePhoto[] newArray(int size) {
return new MediaStorePhoto[size];
}
};
private String id;
private String displayName;
private String bucket;
private String date;
private String size;
private String status;
private String dataUri;
private String bucketId;
public MediaStorePhoto(String id, String displayName, String bucket, String date, String size, String status, String dataUri, String bucketId) {
this.id = id;
this.displayName = displayName;
...
...
this.bucketId = bucketId;
}
public MediaStorePhoto(Parcel in) {
String[] data = new String[8];
in.readStringArray(data);
this.id = data[0];
this.displayName = data[1];
...
...
this.bucketId = data[7];
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[]{this.id,
this.displayName,
this.bucket,
...
...
this.bucketId});
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
...
...
...
public String getBucketId() {
return bucketId;
}
public void setBucketId(String bucketId) {
this.bucketId = bucketId;
}
}
So, the uri to the image will be in mediaStorePhoto.getDataUri()
also mediaStorePhoto.getBucket()
will get you the name of the directory.