Android 根据相册预览内存中的图片和视屏
2017-03-19 本文已影响282人
cao健强
前言: 在开发中有个需求需要访问本地图片和视屏进行上传,所以尝试了以下访问本地的图片和视屏并利用gridView展示出来。
正文
一、先创建一个异步任务用于查询数据库中图片、相册、视屏等数据,代码如下:
package com.example.test1.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.example.test1.R;
import com.example.test1.bean.PhotoUpImageBucket;
import com.example.test1.bean.PhotoUpImageItem;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.Albums;
import android.provider.MediaStore.Images.Media;
import android.provider.MediaStore.Images.Thumbnails;
import android.util.Log;
public class PhotoUpAlbumHelper extends AsyncTask<Object, Object, Object>{
final String TAG = "PhotoUpAlbumHelper";
Context context;
ContentResolver cr;
// 缩略图列表
HashMap<String, String> thumbnailList = new HashMap<String, String>();
// 专辑列表
List<HashMap<String, String>> albumList = new ArrayList<HashMap<String, String>>();
HashMap<String, PhotoUpImageBucket> bucketList = new HashMap<String, PhotoUpImageBucket>();
private GetAlbumList getAlbumList;
//视屏列表
List<HashMap<String, String>> videoList = new ArrayList<HashMap<String,String>>();
private PhotoUpAlbumHelper() {}
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();
}
}
/**
* 得到缩略图
*/
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, String> hash = new HashMap<String, 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()) {
// 获取指定列的索引
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));
Log.d(TAG, "出现了异常图片的地址:cur.getString(photoPathIndex).substring="+cur.getString(photoPathIndex)
.substring(cur.getString(photoPathIndex).lastIndexOf("/")+1,cur.getString(photoPathIndex).lastIndexOf(".")));
}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<PhotoUpImageItem>();
bucket.bucketName = bucketName;
}
bucket.count++;
PhotoUpImageItem imageItem = new PhotoUpImageItem();
imageItem.setImageId(_id);
imageItem.setImagePath(path);
imageItem.setPhoto(true);
// 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<PhotoUpImageBucket> getImagesBucketList(boolean refresh) {
if (refresh || (!refresh && !hasBuildImagesBucketList)) {
buildImagesBucketList();
}
List<PhotoUpImageBucket> tmpList = new ArrayList<PhotoUpImageBucket>();
Iterator<Entry<String, PhotoUpImageBucket>> itr = bucketList.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry<String, PhotoUpImageBucket> entry = (Map.Entry<String, PhotoUpImageBucket>) itr
.next();
tmpList.add(entry.getValue());
}
PhotoUpImageBucket videoBucket= getVideoes();
tmpList.add(videoBucket);
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;
}
private PhotoUpImageBucket getVideoes(){
PhotoUpImageBucket videoes = new PhotoUpImageBucket();
List<PhotoUpImageItem> videoList = new ArrayList<PhotoUpImageItem>();
int count = 0;
String[] params = new String[]{MediaStore.Video.Media._ID
,MediaStore.Video.Media.DISPLAY_NAME,MediaStore.Video.Media.DATA};
//获取游标
Cursor cursor = cr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, params, null, null, null);
//获取制定索引值
int _id = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID);
int _name = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
int _path = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
if (cursor.moveToFirst()) {
do {
if (cursor.getString(_path).substring(
cursor.getString(_path).lastIndexOf("/")+1,
cursor.getString(_path).lastIndexOf("."))
.replaceAll(" ", "").length()<=0)
{
Log.d(TAG, "出现了异常视屏的地址:cur.getString(photoPathIndex)="+cursor.getString(_path));
Log.d(TAG, "出现了异常视屏的地址:cur.getString(photoPathIndex).substring="+cursor.getString(_path)
.substring(cursor.getString(_path).lastIndexOf("/")+1,cursor.getString(_path).lastIndexOf(".")));
}else {
String id = cursor.getString(_id);
String path = cursor.getString(_path);
PhotoUpImageItem video = new PhotoUpImageItem();
video.setImageId(id);
video.setImagePath(path);
video.setPhoto(false);
videoList.add(video);
count++;
}
} while (cursor.moveToNext());
videoes.setCount(count);
videoes.setBucketName(context.getString(R.string.video_file_name));
videoes.setImageList(videoList);
}
return videoes;
}
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<PhotoUpImageBucket> 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<PhotoUpImageBucket>)result);
}
}
其中用到了两个工具实体类:
PhotoUpImageBucket类
package com.example.test1.bean;
import java.io.Serializable;
import java.util.List;
/**
* 一个目录下的相册对象
*/
public class PhotoUpImageBucket implements Serializable{
public int count = 0;//相册中的图片数量
public String bucketName;//相册名
public List<PhotoUpImageItem> imageList;//相册中的图片集合
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public List<PhotoUpImageItem> getImageList() {
return imageList;
}
public void setImageList(List<PhotoUpImageItem> imageList) {
this.imageList = imageList;
}
}
PhotoUpImageItem类
package com.example.test1.bean;
import java.io.Serializable;
/**
* 相册下的图片或视屏对象
*/
public class PhotoUpImageItem implements Serializable {
//图片ID
private String imageId;
//原图路径
private String imagePath;
//是否被选择
private boolean isSelected = false;
//图片还是视屏 true为图片 false为视屏
private boolean isPhoto = true;
public String getImageId() {
return imageId;
}
public void setImageId(String imageId) {
this.imageId = imageId;
}
public String getImagePath() {
return imagePath;
}
public void setImagePath(String imagePath) {
this.imagePath = imagePath;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
}
public boolean isPhoto() {
return isPhoto;
}
public void setPhoto(boolean isPhoto) {
this.isPhoto = isPhoto;
}
}
二、新建一个activity,在其中放置一个GridView用于存放相册集合
package com.example.test1;
import java.util.HashMap;
import java.util.List;
import com.example.test1.adpater.AlbumsAdapter;
import com.example.test1.bean.PhotoUpImageBucket;
import com.example.test1.util.PhotoUpAlbumHelper;
import com.example.test1.util.PhotoUpAlbumHelper.GetAlbumList;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.ThumbnailUtils;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
public class AlbumsActivity extends Activity implements OnScrollListener{
private GridView gridView;
private AlbumsAdapter adapter;
private PhotoUpAlbumHelper photoUpAlbumHelper;
private List<PhotoUpImageBucket> list;
public static HashMap<String, Bitmap> bitmaps = new HashMap<String, Bitmap>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.albums_gridview);
init();
loadData();
onItemClick();
}
private void init(){
gridView = (GridView) findViewById(R.id.album_gridv);
adapter = new AlbumsAdapter(AlbumsActivity.this);
gridView.setAdapter(adapter);
}
private void loadData(){
photoUpAlbumHelper = PhotoUpAlbumHelper.getHelper();
photoUpAlbumHelper.init(AlbumsActivity.this);
photoUpAlbumHelper.setGetAlbumList(new GetAlbumList() {
@Override
public void getAlbumList(List<PhotoUpImageBucket> list) {
adapter.setArrayList(list);
adapter.notifyDataSetChanged();
AlbumsActivity.this.list = list;
}
});
photoUpAlbumHelper.execute(false);
}
//设置gridView的item点击事件
private void onItemClick(){
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(AlbumsActivity.this,AlbumItemActivity.class);
intent.putExtra("imagelist", list.get(position));
startActivity(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
//释放图片的函数
private void recycleBitmapCaches(int fromPosition,int toPosition){
Bitmap delBitmap = null;
for(int del=fromPosition;del<toPosition;del++){
delBitmap = bitmaps.get(list.get(del).getBucketName());
if(delBitmap != null){
//如果非空则表示有缓存的bitmap,需要清理
//从缓存中移除该del->bitmap的映射
bitmaps.remove(list.get(del).getBucketName());
delBitmap.recycle();
delBitmap = null;
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//注释:firstVisibleItem为第一个可见的Item的position,从0开始,随着拖动会改变
//visibleItemCount为当前页面总共可见的Item的项数
//totalItemCount为当前总共已经出现的Item的项数
recycleBitmapCaches(0,firstVisibleItem);
recycleBitmapCaches(firstVisibleItem+visibleItemCount,totalItemCount);
}
}
为GridView定义适配器AlbumsAdapter
package com.example.test1.adpater;
import java.util.ArrayList;
import java.util.List;
import com.example.test1.AlbumsActivity;
import com.example.test1.R;
import com.example.test1.bean.PhotoUpImageBucket;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.media.ThumbnailUtils;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class AlbumsAdapter extends BaseAdapter {
Context mContext;
private List<PhotoUpImageBucket> arrayList;
private LayoutInflater layoutInflater;
private ImageLoader imageLoader = ImageLoader.getInstance();
private DisplayImageOptions options;
private String TAG = AlbumsAdapter.class.getSimpleName();
public AlbumsAdapter(Context context){
mContext = context;
layoutInflater = LayoutInflater.from(context);
arrayList = new ArrayList<PhotoUpImageBucket>();//初始化集合
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.memoryCacheExtraOptions(96, 120)
.build();
// Initialize ImageLoader with configuration.
imageLoader.init(config);
// 使用DisplayImageOption.Builder()创建DisplayImageOptions
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.album_default_loading_pic) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.album_default_loading_pic) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.album_default_loading_pic) // 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中
// .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
.bitmapConfig(Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build(); // 创建配置过的DisplayImageOption对象
};
@Override
public int getCount() {
return arrayList.size();
}
@Override
public Object getItem(int position) {
return arrayList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Holder holder;
if (convertView == null) {
holder = new Holder();
convertView = layoutInflater.inflate(R.layout.ablums_adapter_item, parent, false);
holder.image = (ImageView) convertView.findViewById(R.id.image);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.count = (TextView) convertView.findViewById(R.id.count);
convertView.setTag(holder);
}else {
holder = (Holder) convertView.getTag();
}
holder.count.setText(""+arrayList.get(position).getCount());
holder.name.setText(arrayList.get(position).getBucketName());
Log.e("aaaaaaaaaaaaaaaaaaaaaa", "con:"+mContext.getString(R.string.video_file_name)+" list:"+arrayList.get(position).getBucketName()+" position:"+position);
if ((mContext.getString(R.string.video_file_name)).equals(
arrayList.get(position).getBucketName())) {//如果是视屏,则起一个线程获取缩略图
holder.image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.album_default_loading_pic));
final Handler mhHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 111:
Bitmap bitmap = (Bitmap) msg.obj;
holder.image.setImageBitmap(bitmap);
AlbumsActivity.bitmaps.put(arrayList.get(position).getBucketName(), bitmap);
break;
default:
break;
}
super.handleMessage(msg);
}
};
new Thread(new Runnable() {
@Override
public void run() {
String videoPath = arrayList.get(position).getImageList().get(0).getImagePath();
Bitmap bitmap= ThumbnailUtils.createVideoThumbnail(
videoPath,MediaStore.Video.Thumbnails.MINI_KIND);
Message msg = new Message();
msg.what=111;
msg.obj=bitmap;
mhHandler.sendMessage(msg);
}
}).start();
//
}else {
imageLoader.displayImage("file://"+arrayList.get(position).getImageList().get(0).getImagePath(),
holder.image, options);
}
return convertView;
}
class Holder{
ImageView image;
TextView name;
TextView count;
}
public void setArrayList(List<PhotoUpImageBucket> arrayList) {
this.arrayList = arrayList;
}
}
在这里加载图片使用的时imageloader实现加载,以解决GridView加载图片卡顿及内存问题
三、然后是进入相册后图片列表的activity
首先是albm_item_images.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ffffff" >
<RelativeLayout
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#ff78ccf2">
<TextView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dp"
android:textColor="#ffffff"
android:textSize="14sp"
android:text="@android:string/cancel"/>
<TextView
android:id="@+id/sure"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:textColor="#ffffff"
android:textSize="14sp"
android:text="@android:string/yes"/>
</RelativeLayout>
<GridView
android:id="@+id/album_item_gridv"
android:listSelector="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:horizontalSpacing="8dp"
android:verticalSpacing="20dp"
android:numColumns="3"
android:layout_marginTop="10dp"
android:layout_centerHorizontal="true"
/>
</RelativeLayout>
AlbumItemActivity,显示图片的界面
import com.example.test1.bean.PhotoUpImageBucket;
import com.example.test1.bean.PhotoUpImageItem;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
public class AlbumItemActivity extends Activity implements OnClickListener, OnScrollListener{
private GridView gridView;
private TextView back,ok;
private PhotoUpImageBucket photoUpImageBucket;
private ArrayList<PhotoUpImageItem> selectImages;
private AlbumItemAdapter adapter;
public static HashMap<String, Bitmap> bitmaps = new HashMap<String, Bitmap>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.album_item_images);
init();
setListener();
}
private void init(){
gridView = (GridView) findViewById(R.id.album_item_gridv);
back = (TextView) findViewById(R.id.back);
ok = (TextView) findViewById(R.id.sure);
selectImages = new ArrayList<PhotoUpImageItem>();
Intent intent = getIntent();
photoUpImageBucket = (PhotoUpImageBucket) intent.getSerializableExtra("imagelist");
adapter = new AlbumItemAdapter(photoUpImageBucket.getImageList(), AlbumItemActivity.this);
gridView.setAdapter(adapter);
}
private void setListener(){
back.setOnClickListener(this);
ok.setOnClickListener(this);
gridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (photoUpImageBucket.getImageList().get(position).isPhoto()) {//如果是图片的话
CheckBox checkBox = (CheckBox) view.findViewById(R.id.check);
photoUpImageBucket.getImageList().get(position).setSelected(
!checkBox.isChecked());
adapter.notifyDataSetChanged();
Toast.makeText(AlbumItemActivity.this, "postion="+position,
Toast.LENGTH_SHORT).show();
// photoUpImageBucket.getImageList().get(position).setSelected(
// !photoUpImageBucket.getImageList().get(position).isSelected());
// adapter.notifyDataSetChanged();
if (photoUpImageBucket.getImageList().get(position).isSelected()) {
if (selectImages.contains(photoUpImageBucket.getImageList().get(position))) {
}else {
selectImages.add(photoUpImageBucket.getImageList().get(position));
}
}else {
if (selectImages.contains(photoUpImageBucket.getImageList().get(position))) {
selectImages.remove(photoUpImageBucket.getImageList().get(position));
}else {
}
}
}else {//如果是视屏的话
Toast.makeText(AlbumItemActivity.this, "跳转页面,展示视屏", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back:
finish();
break;
case R.id.sure:
// Intent intent = new Intent(AlbumItemActivity.this,SelectedImagesActivity.class);
// intent.putExtra("selectIma", selectImages);
// startActivity(intent);
break;
default:
break;
}
}
//释放图片的函数
private void recycleBitmapCaches(int fromPosition,int toPosition){
Bitmap delBitmap = null;
for(int del=fromPosition;del<toPosition;del++){
delBitmap = bitmaps.get(photoUpImageBucket.getImageList().get(del).getImageId());
if(delBitmap != null){
//如果非空则表示有缓存的bitmap,需要清理
//从缓存中移除该del->bitmap的映射
bitmaps.remove(photoUpImageBucket.getImageList().get(del).getImageId());
delBitmap.recycle();
delBitmap = null;
}
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//注释:firstVisibleItem为第一个可见的Item的position,从0开始,随着拖动会改变
//visibleItemCount为当前页面总共可见的Item的项数
//totalItemCount为当前总共已经出现的Item的项数
recycleBitmapCaches(0,firstVisibleItem);
recycleBitmapCaches(firstVisibleItem+visibleItemCount,totalItemCount);
}
}
具体的图片或者视屏的GridView的适配器
package com.example.test1.adpater;
import java.util.HashMap;
import java.util.List;
import com.example.test1.AlbumsActivity;
import com.example.test1.R;
import com.example.test1.bean.PhotoUpImageItem;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.media.ThumbnailUtils;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
public class AlbumItemAdapter extends BaseAdapter {
private List<PhotoUpImageItem> list;
private LayoutInflater layoutInflater;
private ImageLoader imageLoader;
private DisplayImageOptions options;
private Context mContext;
private HashMap<Integer, Holder> holderMaps = new HashMap<Integer, AlbumItemAdapter.Holder>();
public AlbumItemAdapter(List<PhotoUpImageItem> list,Context context){
this.list = list;
mContext = context;
layoutInflater = LayoutInflater.from(context);
imageLoader = ImageLoader.getInstance();
// 使用DisplayImageOption.Builder()创建DisplayImageOptions
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.album_default_loading_pic) // 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.album_default_loading_pic) // 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.album_default_loading_pic) // 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true) // 设置下载的图片是否缓存在内存中
.cacheOnDisc(true) // 设置下载的图片是否缓存在SD卡中
// .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
.bitmapConfig(Config.ARGB_8888)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build(); // 创建配置过的DisplayImageOption对象
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Holder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.album_item_images_item_view, parent, false);
holder = new Holder();
holder.imageView = (ImageView) convertView.findViewById(R.id.image_item);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.check);
holder.videPlay = (ImageView) convertView.findViewById(R.id.video_play);
convertView.setTag(holder);
holderMaps.put(position, holder);
}else {
holder = (Holder) convertView.getTag();
holderMaps.put(position, holder);
}
if (list.get(position).isPhoto()) {
//图片加载器的使用代码,就这一句代码即可实现图片的加载。请注意
//这里的uri地址,因为我们现在实现的是获取本地图片,所以使
//用"file://"+图片的存储地址。如果要获取网络图片,
//这里的uri就是图片的网络地址。
imageLoader.displayImage("file://"+list.get(position).getImagePath(), holder.imageView, options);
holder.checkBox.setChecked(list.get(position).isSelected());
holder.videPlay.setVisibility(View.GONE);
}else {
holder.imageView.setImageDrawable(mContext.getResources().getDrawable(R.drawable.album_default_loading_pic));
final Handler mhHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 111:
Bitmap bitmap = (Bitmap) msg.obj;
int num = msg.arg1;
Holder mHolder= holderMaps.get(num);
if (bitmap!=null) {
mHolder.imageView.setImageBitmap(bitmap);
AlbumsActivity.bitmaps.put(list.get(position).getImageId(), bitmap);
}
mHolder.videPlay.setVisibility(View.VISIBLE);
mHolder.checkBox.setVisibility(View.GONE);
break;
default:
break;
}
super.handleMessage(msg);
}
};
new Thread(new Runnable() {
@Override
public void run() {
String videoPath = list.get(position).getImagePath();
Bitmap bitmap= ThumbnailUtils.createVideoThumbnail(
videoPath,MediaStore.Video.Thumbnails.MINI_KIND);
// if (bitmap!=null) {
// holder.imageView.setImageBitmap(bitmap);
// AlbumsActivity.bitmaps.put(list.get(position).getImageId(), bitmap);
// }
// holder.videPlay.setVisibility(View.VISIBLE);
// holder.checkBox.setVisibility(View.GONE);
Message msg = new Message();
msg.what=111;
msg.obj=bitmap;
msg.arg1=position;
mhHandler.sendMessage(msg);
}
}).start();
}
return convertView;
}
class Holder{
ImageView imageView;
CheckBox checkBox;
ImageView videPlay;
}
}
需要注意的是,在数据库中查询道德视屏时没有缩略图的uri的,所以我们适配时的适配展示图需要用
Bitmap bitmap= ThumbnailUtils.createVideoThumbnail(
videoPath,MediaStore.Video.Thumbnails.MINI_KIND);
来获取缩略图,但因为imageloader加载图片时用url进行记载的。
我们加载视屏缩略图时要使用setImageBitmap(Bitmap)方法,那么我们就还需要释放我们的资源:
AlbumsActivity.bitmaps.put(arrayList.get(position).getBucketName(), bitmap);
//释放图片的函数
private void recycleBitmapCaches(int fromPosition,int toPosition){
Bitmap delBitmap = null;
for(int del=fromPosition;del<toPosition;del++){
delBitmap = bitmaps.get(list.get(del).getBucketName());
if(delBitmap != null){
//如果非空则表示有缓存的bitmap,需要清理
//从缓存中移除该del->bitmap的映射
bitmaps.remove(list.get(del).getBucketName());
delBitmap.recycle();
delBitmap = null;
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//注释:firstVisibleItem为第一个可见的Item的position,从0开始,随着拖动会改变
//visibleItemCount为当前页面总共可见的Item的项数
//totalItemCount为当前总共已经出现的Item的项数
recycleBitmapCaches(0,firstVisibleItem);
recycleBitmapCaches(firstVisibleItem+visibleItemCount,totalItemCount);
}
总结:
在实现获取相册中的图片或视频时需要注意的几点是:
- 在加载时要放在异步线程中执行,否在可能会导致ART。
- 加载图片使用imageloader以解决缓存及卡顿问题。
- 当要展示视频缩略图时需要自己生成Bitmap对象并加载,这是要注意释放资源。