Android获取本地图片和相册

这两天在做一个Android相册的Demo,需要获取手机中所有的图片,并把相同文件夹下的图片归类到同一个相册里面。我使用ImageProvider类来完成这项工作。但这个类获取的图片只包含ID和路径等,真正加载图片需要使用另一个类ImageLoader。本文主要通过ContentResolver这个类得到手机中所有的图片,通过对比图片的相册ID来对图片进行归类。代码如下:

/**
 * Created by YangHao on 2015/7/14.
 * 异步线程提供相册和照片
 */
public class ImageProvider extends AsyncTask<Object, Object, Integer> {

    //相册列表
    private List mImageBucketList = new ArrayList<>();
    //相册列表加载完成后的回调
    private OnLoadedBucketListListener onLoadedBucketListListener;

    //单例模式
    private static ImageProvider mImageProvider = null;

    public static ImageProvider getInstance() {
        if (mImageProvider == null)
            mImageProvider = new ImageProvider();
        return mImageProvider;
    }

    /**
     * 获得相册列表。
     * 如果在这之前没有调用过 loadImageBucketList()方法来加载列表,则不能获取到正确的相册列表
     * 可以通过调用 hasLoadBucketList()方法来检查是否加载过相册列表
     * 若要刷新列表,请调用@loadImageBucketList
     *
     * @return 相册列表
     * @see #loadImageBucketList(Context, OnLoadedBucketListListener)
     */
    public List getImageBucketList() {
        return mImageBucketList;
    }

    /**
     * 加载相册列表。
     * 如果在这之前已经调用过该方法,且不需要刷新列表,则可以调用getImageBucketList来直接获得相册列表
     * 可以通过调用 hasLoadBucketList()方法来检查是否加载过相册列表
     *
     * @param context  上下文
     * @param listener 当相册列表加载完成后的回调
     */
    public void loadImageBucketList(Context context, @Nullable OnLoadedBucketListListener listener) {
        onLoadedBucketListListener = listener;
        this.execute(context);
    }

    /**
     * 判断相册列表是否已经加载了
     *
     * @return true 如果相册列表长度不为0
     * false 如果相册列表长度为0
     */
    public boolean hasLoadBucketList() {
        if (mImageBucketList.size() != 0) {
            return true;
        }
        return false;
    }

    //构建图像列表
    private void buildImageBucketList(Context context) {
        //HashMap作为临时容器,以相册名为键来对图片分类。最后转换会为List
        HashMap tBucketMap = new HashMap<>();
        //新建查询列
        String columns[] = new String[]{
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DATA,
                MediaStore.Images.Media.BUCKET_ID,
                MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
        //新建查询
        Cursor cur = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                columns, null, null, MediaStore.Images.Media.DATE_MODIFIED + " desc");
        if (cur.moveToFirst()) {
            int indexPhotoID = cur.getColumnIndexOrThrow(columns[0]);
            int indexPhotoPath = cur.getColumnIndexOrThrow(columns[1]);
            int indexBucketID = cur.getColumnIndexOrThrow(columns[2]);
            int indexBucketDisplay = cur.getColumnIndexOrThrow(columns[3]);
            do {
                String id = cur.getString(indexPhotoID);
                String path = cur.getString(indexPhotoPath);
                String bucketID = cur.getString(indexBucketID);
                String bucketDisplay = cur.getString(indexBucketDisplay);
                //得到相册
                ImageBucket bucket = tBucketMap.get(bucketID);
                //如果没有该相册,则新建一个
                if (bucket == null) {
                    bucket = new ImageBucket();
                    bucket.setImageList(new ArrayList());
                    bucket.setBucketName(bucketDisplay);
                    tBucketMap.put(bucketID, bucket);
                }
                //更新相册
                ImageItem image = new ImageItem();
                image.setImageId(id);
                image.setImagePath(path);
                image.setBucket(bucket);
                bucket.getImageList().add(image);
            } while (cur.moveToNext());
        }
        cur.close();
        //HashMap转List
        List tmpList = new ArrayList<>();
        Iterator> itr = tBucketMap.entrySet().iterator();
        while (itr.hasNext()) {
            Map.Entry entry = itr.next();
            tmpList.add(entry.getValue());
        }
        mImageBucketList = tmpList;
    }

    //相册列表加载完成后的回调
    public interface OnLoadedBucketListListener {
        void onLoaded(List list);
    }

    @Override
    protected Integer doInBackground(Object... params) {
        buildImageBucketList((Context) (params[0]));
        return 0;
    }

    @Override
    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        if (onLoadedBucketListListener != null) {
            onLoadedBucketListListener.onLoaded(mImageBucketList);
        }
    }
}

在第一次使用该类时,需要调用loadImageBucketList()方法来构建相册列表。构建过程在后台执行。调用示例如下:

private void loadImage() {
        ImageProvider imageProvider = ImageProvider.getInstance();
        imageProvider.loadImageBucketList(this, new ImageProvider.OnLoadedBucketListListener() {
            @Override
            public void onLoaded(List list) {
                ...
            }
        });
    }

构建了相册列表之后,如果不需要刷新列表,则可以使用getImageBucketList()直接获得相册列表。调用示例:

bucketList=ImageProvider.getInstance().getImageBucketList();

ImageBucket类和ImageItem类定义如下:(省略了getter&setter)

public class ImageBucket {

    private String bucketName;//相册名
    private List imageList;//相册中图片列表
    private List selectedImageList = new ArrayList<>();//已选择的图片列表
    ...
}
public class ImageItem {

    private String imageId;//图像ID
    private String imagePath;//图像路径
    private boolean isSelected = false;//是否被选择
    private ImageBucket bucket;//持有一个相册类引用
    ...
}

你可能感兴趣的:(Android开发)