Hi I am developing android Gallery app . I am fetching the images from a folder in sd card and displaying it on a grid view as below
public static ArrayList<String> getFilePaths()
{
ArrayList<String> filePaths = new ArrayList<String>();
File directory = new File(android.os.Environment.getExternalStorageDirectory() + File.separator + AppConstant.PHOTO_ALBUM);
// check for directory
if (directory.isDirectory())
{
// getting list of file paths
File[] listFiles = directory.listFiles();
// Check for count
if (listFiles.length > 0)
{
for (int i = 0; i < listFiles.length; i++)
{
String filePath = listFiles[i].getAbsolutePath();
if (IsSupportedFile(filePath))
{
// Add image path to array list
filePaths.add(filePath);
}
}
}
else
{
// image directory is empty
Toast.makeText(
_context,
AppConstant.PHOTO_ALBUM
+ " is empty. Please load some images in it !",
Toast.LENGTH_LONG).show();
}
}
return filePaths;
}
//fetching all image paths
imagePaths = utils.getFilePaths();
adapter = new GridViewImageAdapter(GridViewActivity.this, imagePaths, columnWidth);
// setting grid view adapter
gridView.setAdapter(adapter);
I want to display all the images from SD card not only in a specified folder. I am not sure How to do it.
Please Help. Thanks!
Use this Method. This will return list all the images path inside your sdcard, and if you don't want any specified image extension you can filter that out.
public ArrayList<String> getFilePaths()
{
Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = {MediaStore.Images.ImageColumns.DATA};
Cursor c = null;
SortedSet<String> dirList = new TreeSet<String>();
ArrayList<String> resultIAV = new ArrayList<String>();
String[] directories = null;
if (u != null)
{
c = managedQuery(u, projection, null, null, null);
}
if ((c != null) && (c.moveToFirst()))
{
do
{
String tempDir = c.getString(0);
tempDir = tempDir.substring(0, tempDir.lastIndexOf("/"));
try{
dirList.add(tempDir);
}
catch(Exception e)
{
}
}
while (c.moveToNext());
directories = new String[dirList.size()];
dirList.toArray(directories);
}
for(int i=0;i<dirList.size();i++)
{
File imageDir = new File(directories[i]);
File[] imageList = imageDir.listFiles();
if(imageList == null)
continue;
for (File imagePath : imageList) {
try {
if(imagePath.isDirectory())
{
imageList = imagePath.listFiles();
}
if ( imagePath.getName().contains(".jpg")|| imagePath.getName().contains(".JPG")
|| imagePath.getName().contains(".jpeg")|| imagePath.getName().contains(".JPEG")
|| imagePath.getName().contains(".png") || imagePath.getName().contains(".PNG")
|| imagePath.getName().contains(".gif") || imagePath.getName().contains(".GIF")
|| imagePath.getName().contains(".bmp") || imagePath.getName().contains(".BMP")
)
{
String path= imagePath.getAbsolutePath();
resultIAV.add(path);
}
}
// }
catch (Exception e) {
e.printStackTrace();
}
}
}
return resultIAV;
}
Use content provider to get all the images from MediaStrore.Images.Media
public void fetchImageIds(){
Cursor cursor = getContentResolver()
.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{}, null, null)
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
ids.add(cursor.getInt(cursor.getColumnIndex(MediaStore.Images.Media._ID)));
cursor.moveToNext();
}
adapter.notifyDataSetChanged();
}
in gridView's adapter
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(SeeYourself.this);
Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail(contentResolver, ids.get(position), MediaStore.Images.Thumbnails.MICRO_KIND, null);
imageView.setImageBitmap(bitmap);
return imageView; //To change body of implemented methods use File | Settings | File Templates.
}
this works for me
private void load_image_files(File dir) {
String extention = ".jpg";
File[] listFile = dir.listFiles();
if (listFile != null) {
for (int i = 0; i < listFile.length; i++) {
if (listFile[i].isDirectory()) {
load_image_files(listFile[i]);
} else {
if (listFile[i].getName().endsWith(extention)) {
name_list.add(listFile[i].getName());
name_path_list.add(listFile[i].getAbsolutePath());
}
}
}
}
}
Use this function it return list of Images from both Internal and External Memory card
public static ArrayList<ImageDataModel> allImages = new ArrayList<ImageDataModel>();
Put it in Util class
/**
* Getting All Images Path.
*
* @param activity
* the activity
* @return ArrayList with images Path
*/
public static ArrayList<ImageDataModel> gettAllImages(Activity activity) {
//Remove older images to avoid copying same image twice
allImages.clear();
Uri uri;
Cursor cursor;
int column_index_data, column_index_folder_name;
String absolutePathOfImage = null, imageName;
//get all images from external storage
uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = { MediaColumns.DATA,
MediaStore.Images.Media.DISPLAY_NAME };
cursor = activity.getContentResolver().query(uri, projection, null,
null, null);
column_index_data = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
column_index_folder_name = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
while (cursor.moveToNext()) {
absolutePathOfImage = cursor.getString(column_index_data);
imageName = cursor.getString(column_index_folder_name);
allImages.add(new ImageDataModel(imageName, absolutePathOfImage));
}
// Get all Internal storage images
uri = android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI;
cursor = activity.getContentResolver().query(uri, projection, null,
null, null);
column_index_data = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
column_index_folder_name = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
while (cursor.moveToNext()) {
absolutePathOfImage = cursor.getString(column_index_data);
imageName = cursor.getString(column_index_folder_name);
allImages.add(new ImageDataModel(imageName, absolutePathOfImage));
}
return allImages;
}
}
Model Class to hold imagedata
public class ImageDataModel {
private String imageTitle , imagePath;
/**
* @return the imageTitle
*/
public String getImageTitle() {
return imageTitle;
}
/**
* @param imageTitle the imageTitle to set
*/
public void setImageTitle(String imageTitle) {
this.imageTitle = imageTitle;
}
/**
* @return the imagePath
*/
public String getImagePath() {
return imagePath;
}
/**
* @param imagePath the imagePath to set
*/
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
public ImageDataModel(String imageTitle, String imagePath) {
super();
this.imageTitle = imageTitle;
this.imagePath = imagePath;
}
}
Result :-
if you are still facing problem full code is available on Github
https://github.com/hiteshsahu/AwesomeAndroid-Gallery
/**
* Getting All Images Path
*
* @param activity
* @return ArrayList with images Path
*/
public static ArrayList<String> getAllShownImagesPath(Activity activity) {
Uri uri;
Cursor cursor;
int column_index;
StringTokenizer st1;
ArrayList<String> listOfAllImages = new ArrayList<String>();
String absolutePathOfImage = null;
uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
String[] projection = { MediaColumns.DATA };
cursor = activity.getContentResolver().query(uri, projection, null,
null, null);
column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
while (cursor.moveToNext()) {
absolutePathOfImage = cursor.getString(column_index);
listOfAllImages.add(absolutePathOfImage);
}
return listOfAllImages;
}