获取相册主要原理就是通过
ContentResolver
访问系统数据库表,里面有文件的信息,在同一个文件夹的,就表示在一个相册,并且归结为一类
package com.example.administrator.iphoto.helper;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.os.AsyncTask;
import android.provider.MediaStore.Audio.Albums;
import android.provider.MediaStore.Images.Media;
import android.provider.MediaStore.Images.Thumbnails;
import android.util.Log;
import com.example.administrator.iphoto.model.ImageBucket;
import com.example.administrator.iphoto.model.ImageItem;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class AlbumHelper extends AsyncTask, Object, Object> {
final String TAG = getClass().getSimpleName();
Context context ;
ContentResolver cr ;
// 缩略图列表
HashMap, String> thumbnailList = new HashMap, String>();
// 专辑列表 Q
List, String>> albumList = new ArrayList, String>>();
HashMap, ImageBucket> bucketList = new HashMap, ImageBucket>();
private GetAlbumList getAlbumList ;
private AlbumHelper() {}
public static AlbumHelper getHelper () {
AlbumHelper instance = new AlbumHelper();
return instance;
}
/**
* 初始化
* @param context
*/
public void init (Context context) {
if (this .context == null ) {
this .context = context;
cr = context.getContentResolver();
}
}
/**
* 得到缩略图
*/
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());
}
}
/**
* 得到原图 -n
*/
void getAlbum () {
String[] projection = { Albums._ID , Albums.ALBUM , Albums.ALBUM_ART ,
Albums.ALBUM_KEY , Albums.ARTIST , Albums.NUMBER_OF_SONGS };
Cursor cursor1 = cr .query(Albums.EXTERNAL_CONTENT_URI , projection, null,
null, Albums.ALBUM_ID +" desc" );
getAlbumColumnData(cursor1);
cursor1.close();
}
/**
* 从本地数据库中得到原图
* @param cur
*/
private void getAlbumColumnData (Cursor cur) {
if (cur.moveToFirst()) {
int _id;
String album;
String albumArt;
String albumKey;
String artist;
int numOfSongs;
int _idColumn = cur.getColumnIndex(Albums._ID );
int albumColumn = cur.getColumnIndex(Albums.ALBUM );
int albumArtColumn = cur.getColumnIndex(Albums.ALBUM_ART );
int albumKeyColumn = cur.getColumnIndex(Albums.ALBUM_KEY );
int artistColumn = cur.getColumnIndex(Albums.ARTIST );
int numOfSongsColumn = cur.getColumnIndex(Albums.NUMBER_OF_SONGS );
do {
_id = cur.getInt(_idColumn);
album = cur.getString(albumColumn);
albumArt = cur.getString(albumArtColumn);
albumKey = cur.getString(albumKeyColumn);
artist = cur.getString(artistColumn);
numOfSongs = cur.getInt(numOfSongsColumn);
HashMap, String> hash = new HashMap, String>();
hash.put("_id" , _id + "" );
hash.put("album" , album);
hash.put("albumArt" , albumArt);
hash.put("albumKey" , albumKey);
hash.put("artist" , artist);
hash.put("numOfSongs" , numOfSongs + "" );
albumList .add(hash);
} while (cur.moveToNext());
}
}
/**
* 是否创建了图片集
*/
boolean hasBuildImagesBucketList = false;
/**
* 得到图片集
*/
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()) {
// 获取指定列的索引 , 注意 Media 是 Image Media, 获取到的当然是图片资源
int photoIDIndex = cur.getColumnIndexOrThrow(Media._ID ); // 文件 ID
int photoPathIndex = cur.getColumnIndexOrThrow(Media.DATA ); // 文件路径
int bucketDisplayNameIndex = cur.getColumnIndexOrThrow(Media.BUCKET_DISPLAY_NAME ); // 文件所在文件夹名称
int bucketIdIndex = cur.getColumnIndexOrThrow(Media.BUCKET_ID ); // 文件所在文件夹 ID
/**
* Description: 这里增加了一个判断:判断照片的名字是否合法,例如 .jpg .png 图片名字是不合法的,直接过滤掉
*/
String aa = cur.getString(photoPathIndex);
do {
String _id = cur.getString(photoIDIndex);
String path = cur.getString(photoPathIndex);
String bucketName = cur.getString(bucketDisplayNameIndex);
String bucketId = cur.getString(bucketIdIndex);
ImageBucket bucket = bucketList .get(bucketId);
if (bucket == null ) {
bucket = new ImageBucket();
bucketList .put(bucketId, bucket);
bucket.imageList = new ArrayList();
bucket.bucketName = bucketName;
}
bucket.count ++;
ImageItem imageItem = new ImageItem();
imageItem.setImageId(_id);
imageItem.setImagePath(path);
// imageItem.setThumbnailPath(thumbnailList.get(_id));
bucket.imageList .add(imageItem);
Log.i (TAG , "PhotoUpAlbumHelper 类中 的 —— 》 path=" +thumbnailList .get(_id));
} while (cur.moveToNext());
}
cur.close();
hasBuildImagesBucketList = true;
}
/**
* 得到图片集
* @param refresh
* @return
*/
public List getImagesBucketList (boolean refresh) {
if (refresh || (!refresh && !hasBuildImagesBucketList )) {
buildImagesBucketList();
}
List tmpList = new ArrayList();
Iterator, ImageBucket>> itr = bucketList .entrySet().iterator();
while (itr.hasNext()) {
Map.Entry, ImageBucket> entry = (Map.Entry, ImageBucket>) itr
.next();
tmpList.add(entry.getValue());
}
return tmpList;
}
/**
* 得到原始图像路径
* @param image_id
* @return
*/
String getOriginalImagePath (String image_id) {
String path = null;
Log.i (TAG , "---(^o^)----" + image_id);
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 destoryList ()
{
thumbnailList .clear();
thumbnailList = null;
albumList .clear();
albumList = null;
bucketList .clear();
bucketList = null;
}
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);
}
}
参考地址:http://blog.csdn.net/u010156024/article/details/44136543