该项目实现的功能如下:

获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可以实现所选图片的上传等功能。

该项目最大特色:

1、获取相册列表,目前网络上面介绍获取相册的项目很少,本文专门讲述相册的获取。

2、使用Android-Universal-Image-Loader集成框架-第三方jar包加载本地图片,熟悉这个jar的开发者肯定不陌生,该jar包十分强大,除了可以获取网络图片,本地图片也是可以的。同时,通过引用第三方jar可以有效解决OOM异常问题。

最近CSDN可能出现问题了,图片上传不了,所以没有办法给大家看效果图。

首先讲解获取手机相册的原理:

我们都知道获取手机图片要使用到ContentResolver这个类,但是通过这个类获取相册,是获取不到的,只能获取到相册的ID,相册封面图片无法获取(至少目前我在写本篇博文时,还不知道如何直接获取手机相册,如果大家知道如何直接获取相册的话勿怪哈,本人水平有限^_^,同时也请不吝赐教,请留言哈【握手】)。所以该项目在实现获取手机相册的时候,是通过先获取手机相册的ID,然后获取手机内容全部图片,通过比较图片所在的相册ID,把每一个图片归并到相应的相册中去。

现在给出获取相册以及相册内部图片的类,获取相册和图片在这一个类中完成。代码如下:

/**

* 异步线程类实现该功能

*/

public class PhotoUpAlbumHelper extends AsyncTask{

final String TAG = getClass().getSimpleName();

Context context;

ContentResolver cr;

// 缩略图列表

HashMap thumbnailList = new HashMap();

// 专辑列表

List> albumList = new ArrayList>();

HashMap bucketList = new HashMap();

private GetAlbumList getAlbumList;

//获取实例

public static PhotoUpAlbumHelper getHelper() {

PhotoUpAlbumHelper instance = new PhotoUpAlbumHelper();

return instance;

}

/**

* 初始化

* @param context

*/

public void init(Context context) {

if (this.context == null) {

this.context = context;

cr = context.getContentResolver();

}

}

/**

* 得到缩略图,这里主要得到的是图片的ID值

*/

private void getThumbnail() {

String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,

Thumbnails.DATA};

Cursor cursor1 = Thumbnails.queryMiniThumbnails(cr, Thumbnails.EXTERNAL_CONTENT_URI,

Thumbnails.MINI_KIND, projection);

getThumbnailColumnData(cursor1);

cursor1.close();

}

/**

* 从数据库中得到缩略图

* @param cur

*/

private void getThumbnailColumnData(Cursor cur) {

if (cur.moveToFirst()) {

int image_id;

String image_path;

int image_idColumn = cur.getColumnIndex(Thumbnails.IMAGE_ID);

int dataColumn = cur.getColumnIndex(Thumbnails.DATA);

do {

image_id = cur.getInt(image_idColumn);

image_path = cur.getString(dataColumn);

thumbnailList.put("" + image_id, image_path);

} while (cur.moveToNext());

}

}

/**

* 是否创建了图片集

*/

boolean hasBuildImagesBucketList = false;

/**

* 得到图片集

*/

private void buildImagesBucketList() {

// 构造缩略图索引

getThumbnail();

// 构造相册索引

String columns[] = new String[] { Media._ID, Media.BUCKET_ID,

Media.PICASA_ID, Media.DATA, Media.DISPLAY_NAME, Media.TITLE,

Media.SIZE, Media.BUCKET_DISPLAY_NAME };

// 得到一个游标

Cursor cur = cr.query(Media.EXTERNAL_CONTENT_URI, columns, null, null,

Media.DATE_MODIFIED+" desc");

if (cur.moveToFirst()) {

// 获取指定列的索引

int photoIDIndex = cur.getColumnIndexOrThrow(Media._ID);

int photoPathIndex = cur.getColumnIndexOrThrow(Media.DATA);

int bucketDisplayNameIndex = cur.getColumnIndexOrThrow(Media.BUCKET_DISPLAY_NAME);

int bucketIdIndex = cur.getColumnIndexOrThrow(Media.BUCKET_ID);

/**

* Description:这里增加了一个判断:判断照片的名

* 字是否合法,例如.jpg .png等没有名字的格式

* 如果图片名字是不合法的,直接过滤掉

*/

do {

if (cur.getString(photoPathIndex).substring(

cur.getString(photoPathIndex).lastIndexOf("/")+1,

cur.getString(photoPathIndex).lastIndexOf("."))

.replaceAll(" ", "").length()<=0)

{

Log.d(TAG, "出现了异常图片的地址:cur.getString(photoPathIndex)="+cur.getString(photoPathIndex));

}else {

String _id = cur.getString(photoIDIndex);

String path = cur.getString(photoPathIndex);

String bucketName = cur.getString(bucketDisplayNameIndex);

String bucketId = cur.getString(bucketIdIndex);

PhotoUpImageBucket bucket = bucketList.get(bucketId);

//这里完成图片归并到响应的相册里去

if (bucket == null) {

bucket = new PhotoUpImageBucket();

bucketList.put(bucketId, bucket);

bucket.imageList = new ArrayList();

bucket.bucketName = bucketName;

}

bucket.count++;

PhotoUpImageItem imageItem = new PhotoUpImageItem();

imageItem.setImageId(_id);

imageItem.setImagePath(path);

bucket.imageList.add(imageItem);

}

} while (cur.moveToNext());

}

cur.close();

hasBuildImagesBucketList = true;

}

/**

* 得到图片集

* @param refresh

* @return

*/

private List getImagesBucketList(boolean refresh) {

if (refresh || (!refresh && !hasBuildImagesBucketList)) {

buildImagesBucketList();

}

List tmpList = new ArrayList();

Iterator> itr = bucketList.entrySet().iterator();

//将Hash转化为List

while (itr.hasNext()) {

Map.Entry entry = (Map.Entry) itr

.next();

tmpList.add(entry.getValue());

}

return tmpList;

}

/**

* 得到原始图像路径

* @param image_id

* @return

*/

private String getOriginalImagePath(String image_id) {

String path = null;

String[] projection = { Media._ID, Media.DATA };

Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, projection,

Media._ID + "=" + image_id, null, Media.DATE_MODIFIED+" desc");

if (cursor != null) {

cursor.moveToFirst();

path = cursor.getString(cursor.getColumnIndex(Media.DATA));

}

return path;

}

public void setGetAlbumList(GetAlbumList getAlbumList) {

this.getAlbumList = getAlbumList;

}

//回调接口,当完成相册和图片的获取之后,调用该接口的方法传递数据,这种方法很常用,大家务必掌握

public interface GetAlbumList{

public void getAlbumList(List list);

}

@Override

protected Object doInBackground(Object... params) {

return getImagesBucketList((Boolean)(params[0]));

}

@SuppressWarnings("unchecked")

@Override

protected void onPostExecute(Object result) {

super.onPostExecute(result);

getAlbumList.getAlbumList((List)result);

}

}

该类使用异步线程类实现,并通过回调接口传递数据,在执行异步线程完成之后,通过如下代码传递数据。

protected void onPostExecute(Object result) {

super.onPostExecute(result);

getAlbumList.getAlbumList((List)result);

}

在Activity中使用如下方式获取上面得到的数据:

private void loadData(){

photoUpAlbumHelper = PhotoUpAlbumHelper.getHelper();//创建异步线程实例

photoUpAlbumHelper.init(AlbumsActivity.this);//初始化实例

//回调接口,创建匿名内部对象,实现接口中的方法,获取到PhotoUpAlbumHelper的接口GetAlbumList所传递的数据

photoUpAlbumHelper.setGetAlbumList(new GetAlbumList() {

@Override

public void getAlbumList(List list) {

adapter.setArrayList(list);

adapter.notifyDataSetChanged();//更新视图

AlbumsActivity.this.list = list;

}

});

photoUpAlbumHelper.execute(false);//异步线程执行

}

下面两篇博文中会介绍相册界面和所选择的相册内图片列表界面。

android+获取相册列表,android 获取相册列表的实现(一)相关推荐

  1. android+获取相册列表,android 获取相册列表的实现(二)

    该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可 该项目实现的功能如下: 获取手机相册,点击每个相 ...

  2. android开发 获取相册名称_Android开发之获取相册照片和获取拍照照片

    在Android的开发过程中,我们可能会读取手机里面的照片或者通过相机拍摄获取照片,这是两种常用的获取图片的方式,在做项目过程中也会经常遇到,下面来介绍一下这两种获取方式.. 1.从本地相册获取照片: ...

  3. android 从相册或相机获取图片并且裁剪 支持android 7.0

    1.在res/xml目录中新建一个file_paths.xml <?xml version="1.0" encoding="utf-8"?> < ...

  4. android 新闻功能列表,android根据提供的接口获取新闻列表

    查询新闻列表: 接口名称:GetNewsInfo 接口参数:(string account(账号), string pwd(密码), string newstype(新闻类型[图文新闻(传入4),图片 ...

  5. Android 11获取应用列表 android.permission.QUERY_ALL_PACKAGES

    有了这条语句的加持,在编译时 app的 targetSdkVersion 30就能像SDK29那样在安装列表中找到对应app.若没有,则不能根据应用包名查找是否安装该应用 <uses-permi ...

  6. Android开发之获取相册照片和获取拍照照片

    在Android的开发过程中,我们可能会读取手机里面的照片或者通过相机拍摄获取照片,这是两种常用的获取图片的方式,在做项目过程中也会经常遇到,下面来介绍一下这两种获取方式.. 1.从本地相册获取照片: ...

  7. android 扫描所有图片格式,Android获取本机各种类型文件列表(音乐、视频、图片、文档等)...

    介绍 本篇介绍Android获取本机各种类型文件的方法,已经封装成工具类,末尾有源码下载地址. 提示 获取音乐.视频.图片.文档等文件是需要有读取SD卡的权限的,如果是6.0以下的系统,则直接在清单文 ...

  8. android传感器 列表,android获取传感器列表

    本文介绍如何获取android设备所支持的传感器列表. 目前,android 4.4 (API等级19)支持以下传感器: TYPE_ACCELEROMETER 加速度传感器,单位是m/s2,测量应用于 ...

  9. android 如何获得附近的wifi,Android细节:扫描获取附近wifi,并以列表形式进行展示...

    前一阵子应用中有一个获取附近wifi,并以列表形式进行展示的需求.这个需求很容易满足,核心代码如下: WifiManager wifiManager = (WifiManager) getSystem ...

最新文章

  1. 牛客网 牛客练习赛13 A.幸运数字Ⅰ
  2. boost::geometry::sectionalize用法的测试程序
  3. Android开发之Android Material Design Toolbar自定义随笔
  4. 卫星系统采用的轨道类型
  5. jquery validate验证remote时的多状态问题
  6. 16.What is pass in Python?
  7. mybatis查询返回null解决方案
  8. vue权限问题解决方案
  9. img引用网络图片资源无法加载问题解决
  10. 分门别类刷leetcode——递归和回溯搜索(C++实现)
  11. matlab中int函数的用法
  12. 微信表情图像代表什么意思_微信里的表情每个头像代表什么意思
  13. 数据分析师笔试题(一)
  14. 章子怡对婚姻的憧憬:一生一世!——丹比奴
  15. 最近比较火的古风姓氏头像小程序源码
  16. 大数据信息资料采集:公众号武志红文章评论爬取八爪鱼采集器规则
  17. Python用Requests爬虫实现截屏翻译
  18. 【Matlab】关于matlab开启多核并行计算时SPMD测试失败的解决方法
  19. iOS逆向之反HOOK的基本防护
  20. 领克全球化战略扩展至中东;万豪国际集团2023年将在全球开设超过35家奢华酒店 | 美通企业日报...

热门文章

  1. mPaas苹果客户端离线包引入http的js白屏问题解决办法
  2. VLAN隔离思维导图
  3. 读书百客:《宿新市徐公店》评赏
  4. flutter 图片加载
  5. 拼多多下单助手怎么一键采购、发货的?
  6. Mac下的Kali虚拟机的安装
  7. Mac 格式化TF卡,获取原来的容量大小。
  8. 媒体对华为不公,国人应该清醒 [转]枯荷雨声
  9. 无法打开虚拟机“Ubuntu”,ubuntu.vmx获得所有权失败
  10. 基于深度摄像头的障碍物检测(realsense+opencv)