Android获取本地图片和相册
2015-07-15 13:44
489 查看
这两天在做一个Android相册的Demo,需要获取手机中所有的图片,并把相同文件夹下的图片归类到同一个相册里面。我使用ImageProvider类来完成这项工作。但这个类获取的图片只包含ID和路径等,真正加载图片需要使用另一个类ImageLoader。本文主要通过ContentResolver这个类得到手机中所有的图片,通过对比图片的相册ID来对图片进行归类。代码如下:
在第一次使用该类时,需要调用loadImageBucketList()方法来构建相册列表。构建过程在后台执行。调用示例如下:
构建了相册列表之后,如果不需要刷新列表,则可以使用getImageBucketList()直接获得相册列表。调用示例:
ImageBucket类和ImageItem类定义如下:(省略了getter&setter)
[code]/** * Created by YangHao on 2015/7/14. * 异步线程提供相册和照片 */ public class ImageProvider extends AsyncTask<Object, Object, Integer> { //相册列表 private List<ImageBucket> 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<ImageBucket> 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<String, ImageBucket> 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<ImageItem>()); 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<ImageBucket> tmpList = new ArrayList<>(); Iterator<Map.Entry<String, ImageBucket>> itr = tBucketMap.entrySet().iterator(); while (itr.hasNext()) { Map.Entry<String, ImageBucket> entry = itr.next(); tmpList.add(entry.getValue()); } mImageBucketList = tmpList; } //相册列表加载完成后的回调 public interface OnLoadedBucketListListener { void onLoaded(List<ImageBucket> 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()方法来构建相册列表。构建过程在后台执行。调用示例如下:
[code]private void loadImage() { ImageProvider imageProvider = ImageProvider.getInstance(); imageProvider.loadImageBucketList(this, new ImageProvider.OnLoadedBucketListListener() { @Override public void onLoaded(List<ImageBucket> list) { ... } }); }
构建了相册列表之后,如果不需要刷新列表,则可以使用getImageBucketList()直接获得相册列表。调用示例:
[code]bucketList=ImageProvider.getInstance().getImageBucketList();
ImageBucket类和ImageItem类定义如下:(省略了getter&setter)
[code]public class ImageBucket { private String bucketName;//相册名 private List<ImageItem> imageList;//相册中图片列表 private List<ImageItem> selectedImageList = new ArrayList<>();//已选择的图片列表 ... }
[code]public class ImageItem { private String imageId;//图像ID private String imagePath;//图像路径 private boolean isSelected = false;//是否被选择 private ImageBucket bucket;//持有一个相册类引用 ... }
相关文章推荐
- android ndk
- android访问php webservice简单一例
- Android对话框的生成
- android--面向开发者的即时通讯SDK对比分析
- android通过apktool之反编译 重新打包
- Android的缓存机制——图片的缓存
- android逆向分析之smali练习
- Android Studio Mac 10.5+快捷键使用
- 代码二次封装-xUtils(android)
- Android 最火的快速开发框架AndroidAnnotations使用详解
- android 开源框架xUtils
- Android 利用Theme自定义Activity间的切换动画
- Android移动view动画问题
- Android反编译代码和防止反编译
- Android入门(54)——第九章 使用GestureOverlayView进行手势识别
- android之XListview,上拉下拉出现BUG
- Android应用开发学习—Toast使用方法大全
- Android include布局文件 使用错误
- Android 启动页面弹出效果
- 【AndroidStudio】AndroidStudio如何连接手机