Androidローカル画像とアルバムを入手

9720 ワード

この2,3日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;//         
    ...
}