列出SD卡中的所有图像。

4

你好,我正在开发一款Android相册应用。我正在从SD卡中的一个文件夹中获取图片,并在网格视图上显示它们,如下所示:

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);

我想显示SD卡中所有图片,而不仅仅是指定文件夹中的图片。我不确定该如何做。
请帮忙,谢谢!

你可以仅使用URI而不是文件路径来获取图片,这是从SD卡获取图片的更好方法。 - Praveen Sharma
请查看此链接以了解如何使用MediaStore内容提供程序从SD卡中检索图像并在GridView中显示。 - Raghunandan
改为 File directory = Environment.getExternalStorageDirectory();。我认为这样应该可以。 - MysticMagicϡ
5个回答

18

使用这个方法。它将返回您SD卡中所有图像路径的列表,如果您不想要任何指定的图像扩展名,可以过滤掉它们。

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;


    }

0

使用此函数,它将返回内部和外部存储卡中的图像列表

    public static ArrayList<ImageDataModel> allImages = new ArrayList<ImageDataModel>();

将其放入Util类中

  /**
         * 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;
        }

    }

模型类用于保存图像数据

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;
    }

}

结果:-

Android gallery Sample

如果你仍然遇到问题,完整的代码可以在Github上找到

https://github.com/hiteshsahu/AwesomeAndroid-Gallery


0
/**
 * 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;
}

0
使用内容提供程序从MediaStore.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();
}

在 gridView 的适配器中

@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.
}

0

这对我有效

 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());

                }
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接