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 :-

Android gallery Sample

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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top