您的位置:首页 > 移动开发 > Android开发

GalleryActivity读取本地相册及照片 能够按相册区分 并选取照片

2015-10-27 21:17 441 查看
先看效果图

1 读取本地照片



2  查看本地的相册,以及其中照片信息



3 选择一个相册,查看其中照片



4 选取照片进行操作或者上传



5查看自己选择的照片



下面来看具体的实现

其中最主要的是GalleryActivity,也就是刚开始照片的布局,以及相册的布局

package com.renlei.test;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.*;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.download.ImageDownloader;
import com.nostra13.universalimageloader.core.listener.PauseOnScrollListener;

import java.util.ArrayList;
import java.util.List;

public class GalleryActivity extends Activity implements View.OnClickListener{
/**
* Called when the activity is first created.
*/
private GridView gv ;
private GridAdapter gridAdapter;
private ImageLoaderTask loaderTask;//图片的加载线程
private BucketLoaderTask bucketLoaderTask;//相册的加载线程
private ListView bucketLV;//用与选择相册的预览
private BucketAdapter bucketAdapter;
private TextView bucketTitleTV;//用来选择相册的
private List<BucketInfo>bucketInfos;
private List<ImageInfo>imageInfoList;
private int gvLength;//gridview中每个图片的宽度
private ArrayList<ImageInfo>selectImageInfos = new ArrayList<ImageInfo>();
private int selectCount = 0;
private static final int MAX_NUM = 9;//最多能够选择的照片数
private TextView configTV;///确定
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建默认的ImageLoader配置参数
ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this)
.writeDebugLogs() //打印log信息
.build();

//Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(configuration);

setContentView(R.layout.gallery_activity_layout);
initView();
bindListener();
loadImages();
loadBuckets();
}

@Override
protected void onStart() {
super.onStart();
DisplayMetrics matrix = getResources().getDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(matrix);
gvLength = (matrix.widthPixels-dip2px(8)*4)/3;
}

private void initView(){
gv = (GridView)findViewById(R.id.gv);
bucketLV = (ListView)findViewById(R.id.albums_lv);
bucketTitleTV = (TextView)findViewById(R.id.thumb_title_tv);
configTV = (TextView)findViewById(R.id.config_tv);
}
private void bindListener(){
gv.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(),false,true));
bucketTitleTV.setOnClickListener(this);
bucketLV.setOnItemClickListener(new BucketItemClickListener());
gv.setOnItemClickListener(new MyImageItemClickListener());
configTV.setOnClickListener(this);
}

/**
* 加载图片
*/
private void loadImages(){
loaderTask = new ImageLoaderTask(GalleryActivity.this,new ImageLoaderTask.ImageLoaderListener() {
@Override
public void onLoadFinish(List<ImageInfo> imageInfos) {
if (selectImageInfos!=null){
selectImageInfos.clear();
}else {
selectImageInfos = new ArrayList<ImageInfo>();
}
gridAdapter = new GridAdapter(imageInfos);
gv.setAdapter(gridAdapter);
imageInfoList = imageInfos;
}
});
loaderTask.execute();

}

/**
* 加载相册信息
*/
private void loadBuckets(){
bucketLoaderTask = new BucketLoaderTask(GalleryActivity.this,new BucketLoaderTask.BucketLoaderListener() {
@Override
public void onLoaderFinish(List<String> bucketIds, List<BucketInfo> bucketInfoList) {
bucketInfos = bucketInfoList;
bucketAdapter = new BucketAdapter(GalleryActivity.this,bucketInfoList);
bucketLV.setAdapter(bucketAdapter);
}
});
bucketLoaderTask.execute();
}

private class GridAdapter extends BaseAdapter{
private List<ImageInfo>imageInfos;
public GridAdapter(List<ImageInfo>imageInfos){
this.imageInfos = imageInfos;
}
@Override
public int getCount() {
return imageInfos.size();
}

@Override
public Object getItem(int position) {
return imageInfos.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

ViewHolder viewHolder = null;
if (convertView == null){
convertView = (FrameLayout) getLayoutInflater().inflate(R.layout.gridview_item,null);
viewHolder = new ViewHolder();
viewHolder.photoIV = (ImageView)convertView.findViewById(R.id.grid_item_photo_iv);
viewHolder.checkBox = (ImageView)convertView.findViewById(R.id.grid_item_checkbox_iv);
viewHolder.shadowIV = (ImageView)convertView.findViewById(R.id.shadowImage);
AbsListView.LayoutParams params = (AbsListView.LayoutParams)convertView.getLayoutParams();
if (params!=null){
params.height = gvLength;
params.width = gvLength;
convertView.setLayoutParams(params);
}

FrameLayout.LayoutParams params1 = (FrameLayout.LayoutParams)viewHolder.photoIV.getLayoutParams();
params1.height = gvLength;
params1.width = gvLength;
viewHolder.photoIV.setLayoutParams(params1);
convertView.setTag(viewHolder);
}else {
viewHolder = (ViewHolder)convertView.getTag();
}
if(!imageInfos.get(position).isSelect){
viewHolder.shadowIV.setVisibility(View.GONE);
viewHolder.checkBox.setImageResource(R.drawable.publisher_checkbox_default_select);
}else {
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)viewHolder.shadowIV.getLayoutParams();
if(params!=null){
params.height = gvLength;
params.width = gvLength;
viewHolder.shadowIV.setLayoutParams(params);
}
viewHolder.shadowIV.setVisibility(View.VISIBLE);
viewHolder.checkBox.setImageResource(R.drawable.publisher_checkbox_select);
}
String tempUrl  = ImageDownloader.Scheme.FILE.wrap(imageInfos.get(position).imgUrl);
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.group_bg_album_image)
.cacheInMemory(true)
.cacheOnDisk(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
ImageLoader.getInstance().displayImage(tempUrl,viewHolder.photoIV,options,null);

return convertView;
}
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public  int dip2px(float dpValue) {
final float scale = getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
private class ViewHolder{
ImageView photoIV;
ImageView shadowIV;
ImageView checkBox;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.thumb_title_tv:
bucketTitleTVOnClick();
break;
case R.id.config_tv:
onConfigClick();
break;
}
}
private void onConfigClick(){
Intent intent = new Intent(GalleryActivity.this,ShowResultActivity.class);
intent.putExtra("select_images",selectImageInfos);
startActivity(intent);
}

private void bucketTitleTVOnClick(){
if (bucketLV.getVisibility()== View.GONE){
Animation translateAnimation = AnimationUtils.loadAnimation(GalleryActivity.this,R.anim.bucket_in);
bucketLV.clearAnimation();
bucketLV.setAnimation(translateAnimation);
bucketLV.setVisibility(View.VISIBLE);
}else if(bucketLV.getVisibility() == View.VISIBLE){
Animation translateAnimation = AnimationUtils.loadAnimation(GalleryActivity.this,R.anim.bucket_out);
bucketLV.clearAnimation();
bucketLV.setAnimation(translateAnimation);
bucketLV.setVisibility(View.GONE);
}
}

class BucketItemClickListener implements AdapterView.OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> parent, View view,final int position, long id) {
if (position == 0){
Log.d("renlei BucketItemClickListener", position + "全部图片" + "id" + id);
runOnUiThread(new Runnable() {
@Override
public void run() {
ImageLoaderTask.setSelectBucketId("0");
bucketTitleTV.setText("全部图片");
loadImages();
bucketTitleTVOnClick();
}
});
}else {
runOnUiThread(new Runnable() {
@Override
public void run() {
ImageLoaderTask.setSelectBucketId(bucketInfos.get(position-1).bunketId);
bucketTitleTV.setText(bucketInfos.get(position-1).bunketName);
loadImages();
bucketTitleTVOnClick();
}
});

Log.d("renlei BucketItemClickListener",position+bucketInfos.get(position-1).bunketName+"id"+id);
}
}
}

class MyImageItemClickListener implements AdapterView.OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (imageInfoList.get(position).isSelect){
imageInfoList.get(position).isSelect = false;
selectImageInfos.remove(imageInfoList.get(position));
gridAdapter.notifyDataSetChanged();
}else {
if (selectImageInfos.size()==MAX_NUM){
Toast.makeText(GalleryActivity.this,"最多能够选择"+MAX_NUM+"张照片",Toast.LENGTH_LONG).show();
}else {
imageInfoList.get(position).isSelect = true;
selectImageInfos.add(imageInfoList.get(position));
if (gridAdapter!=null){
gridAdapter.notifyDataSetChanged();
}
}
}

Log.d("renlei","size"+selectImageInfos.size());
Log.d("renlei",selectImageInfos.toString());
}
}

}


下面的这个是加载本地照片的Task

package com.renlei.test;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.util.Log;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
* Created by renlei
* DATE: 15-10-26
* Time: 下午3:54
*/
public class ImageLoaderTask extends AsyncTask {
//    private List<BucketInfo>bunketInfos= new ArrayList<BucketInfo>();
private List<ImageInfo> tempImageInfos = new ArrayList<ImageInfo>();
private ImageLoaderListener mListener;
private Context mContext;
private static String selectBucketId;//需要选择的相册的id
public ImageLoaderTask(Context context,ImageLoaderListener listener){
this.mContext = context;
this.mListener = listener;
}

/**
* 取得数据
* @param params
* @return
*/
@Override
protected Object doInBackground(Object[] params) {
getMediaData();
return null;
}

/**
* 通知主线程
* @param o
*/
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
mListener.onLoadFinish(tempImageInfos);

}

private void getMediaData(){
ContentResolver cr = mContext.getContentResolver();
String []projection = {MediaStore.Images.Media._ID,MediaStore.Images.Media.DATA,MediaStore.Images.Media.DATE_TAKEN,
MediaStore.Images.Media.BUCKET_ID,MediaStore.Images.Media.DISPLAY_NAME,MediaStore.Images.Media.BUCKET_DISPLAY_NAME,MediaStore.Images.Media.HEIGHT};///需要查询的数据
/*String order = MediaStore.Images.Media
.DATE_TAKEN + " desc limit " + PAGE_SIZE + " offset " + (page - 1) * PAGE_SIZE ;*/
String order = MediaStore.Images.Media
.DATE_TAKEN + " desc";
String where = null;
String[] select = null;
int i =0;
HashMap<String,List<ImageInfo>> map =new HashMap<String, List<ImageInfo>>();
if (selectBucketId==null||selectBucketId.equals("0")){
where = "(" +MediaStore.Images.Media.SIZE +"> 10 * 1024)";
}else {
where =  "(" +MediaStore.Images.Media.SIZE +"> 10 * 1024) "+" and ( "+MediaStore.Images.Media.BUCKET_ID+" = "+selectBucketId+" )";
}
Cursor cursor = null;
try {
cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,projection,where,null,order);
while (cursor!=null&&cursor.moveToNext()){
int i_imgId = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
int i_absPath = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
int i_dateTaken = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_TAKEN);
int i_buckId = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_ID);
int i_displayname = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
int i_bucket_displayname = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
int imgId = cursor.getInt(i_imgId);
String absPath = cursor.getString(i_absPath);
Long dateTaken = cursor.getLong(i_dateTaken);
String buckId = cursor.getString(i_buckId);
String displayname = cursor.getString(i_displayname);
String bucket_displayname = cursor.getString(i_bucket_displayname);
ImageInfo imageInfo = new ImageInfo();
//            BucketInfo bunketInfo = new BucketInfo();
imageInfo.imgUrl = absPath;
imageInfo.takeTime = dateTaken;
imageInfo.bunketName = bucket_displayname;
imageInfo.bunketId = buckId;
tempImageInfos.add(imageInfo);
/*bunketInfo.bunketId = buckId;
bunketInfo.bunketName = bucket_displayname;
if (!bunketInfos.contains(bunketInfo)){
bunketInfo.bucketCoverUrl = absPath;
bunketInfos.add(bunketInfo);
}*/
Log.d("renlei", "imgId:" + imgId + "    absPath:" + absPath + "   dateTaken:" + dateTaken + "  buckId:" + buckId + "  displayname:" + displayname + "  bucket_displayname:" + bucket_displayname);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} finally {
if (cursor!=null){
cursor.close();
}
}

}

interface ImageLoaderListener{
void onLoadFinish(List<ImageInfo> imageInfos);
}

public static void setSelectBucketId(String bucketId){
if (bucketId!=null){
selectBucketId = bucketId;
}
}
}


下面的是加载相册的task

package com.renlei.test;

import android.content.ContentResolver;
import android.content.Context;
import android.content.Loader;
import android.database.Cursor;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

/**
* Created by renlei
* DATE: 15-10-26
* Time: 下午4:44
*/
public class BucketLoaderTask extends AsyncTask{
private Context mContext;
private BucketLoaderListener mListener;
private List<String>bucketIds = new ArrayList<String>();///存储所有的相册id
private List<BucketInfo>bucketInfoList = new ArrayList<BucketInfo>();
public BucketLoaderTask(Context context,BucketLoaderListener listener){
this.mContext = context;
this.mListener = listener;
}

@Override
protected Object doInBackground(Object[] params) {
ContentResolver cr = mContext.getContentResolver();
String []projection = {"count(*)", MediaStore.Images.Media.BUCKET_DISPLAY_NAME,MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.DATA,MediaStore.Images.Media._ID};
String where = MediaStore.Images.Media.SIZE+" > 10*1024)"
+" group by "+MediaStore.Images.Media.BUCKET_ID+"-- (";
Cursor bucketCs = null;
try {
bucketCs = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,projection,where,null,null);
while (bucketCs!=null&&bucketCs.moveToNext()){
int i_countId = bucketCs.getColumnIndexOrThrow("count(*)");
int i_bucketNameId = bucketCs.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
int i_bucketIdId = bucketCs.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_ID);
int i_column_index = bucketCs.getColumnIndex(MediaStore.Images.Media.DATA);
int i_id = bucketCs.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
String bucketName = bucketCs.getString(i_bucketNameId);
String bucketId = bucketCs.getString(i_bucketIdId);
String absPath = bucketCs.getString(i_column_index);
String imgId = bucketCs.getString(i_id);
int count = bucketCs.getInt(i_countId);
BucketInfo bucketInfo = new BucketInfo(bucketName,bucketId,absPath,imgId,count);
Log.d("renlei bucketinfo",bucketInfo.toString());
bucketIds.add(bucketId);
bucketInfoList.add(bucketInfo);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} finally {
if (bucketCs!=null)
bucketCs.close();
}
return null;
}

@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
mListener.onLoaderFinish(bucketIds,bucketInfoList);
}

interface BucketLoaderListener{
void onLoaderFinish(List<String>bucketIds ,List<BucketInfo> bucketInfoList);
}
}


相册的Adapter

package com.renlei.test;

import android.content.Context;
import android.graphics.Bitmap;
import android.text.Layout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.download.ImageDownloader;

import java.util.ArrayList;
import java.util.List;

/**
* Created by renlei
* DATE: 15-10-27
* Time: 上午11:15
*/
public class BucketAdapter extends BaseAdapter{
private List<BucketInfo>bucketInfoList;
private Context mContext;
public BucketAdapter(Context context,List<BucketInfo>bucketInfoList){
this.mContext =context;
this.bucketInfoList = bucketInfoList;
}
@Override
public int getCount() {
return bucketInfoList==null ?0 : bucketInfoList.size()+1;
}

@Override
public Object getItem(int position) {
return bucketInfoList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
LayoutInflater inflater;
if (convertView==null){
inflater = LayoutInflater.from(mContext);
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.bucket_item_layout,null);
holder.buckteCover = (ImageView)convertView.findViewById(R.id.bucket_cover_iv);
holder.bucketName = (TextView)convertView.findViewById(R.id.bucket_name_tv);
holder.bucketCount = (TextView)convertView.findViewById(R.id.bucket_image_count);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.group_bg_album_image)
.cacheInMemory(true)
.cacheOnDisk(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
if (position == 0){///单独处理全部图片的
int totalCount = 0;
for (BucketInfo info : bucketInfoList){
totalCount += info.count;
}
holder.bucketCount.setText("( "+totalCount+" )");
holder.bucketName.setText("全部图片");
String tempUrl  = ImageDownloader.Scheme.FILE.wrap(bucketInfoList.get(0).bucketCoverUrl);
ImageLoader.getInstance().displayImage(tempUrl,holder.buckteCover,options);
}else {
holder.bucketCount.setText("( "+bucketInfoList.get(position-1).count+" )");
holder.bucketName.setText(bucketInfoList.get(position-1).bunketName);
String tempUrl  = ImageDownloader.Scheme.FILE.wrap(bucketInfoList.get(position-1).bucketCoverUrl);
ImageLoader.getInstance().displayImage(tempUrl,holder.buckteCover,options);
}
return convertView;
}

class ViewHolder {
ImageView buckteCover;
TextView bucketName;
TextView bucketCount;
}

}

package com.renlei.test;

/**
* Created by renlei
* DATE: 15-10-26
* Time: 下午4:00
*/
public class BucketInfo {
public String bunketName;
public String bunketId;
public String bucketCoverUrl;
public String bucketCoverId;
public int count;

public BucketInfo(String bunketName, String bunketId, String bucketCoverUrl, String bucketCoverId, int count) {
this.bunketName = bunketName;
this.bunketId = bunketId;
this.bucketCoverUrl = bucketCoverUrl;
this.bucketCoverId = bucketCoverId;
this.count = count;
}

@Override
public String toString() {
return "BucketInfo{" +
"bunketName='" + bunketName + '\'' +
", bunketId='" + bunketId + '\'' +
", bucketCoverUrl='" + bucketCoverUrl + '\'' +
", bucketCoverId='" + bucketCoverId + '\'' +
", count=" + count +
'}';
}
}


下载地址  http://download.csdn.net/detail/renlei0109/9218405
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息