GalleryActivity读取本地相册及照片 能够按相册区分 并选取照片
16lz
2021-01-23
先看效果图
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 ListbucketInfos; private ListimageInfoList; private int gvLength;//gridview中每个图片的宽度 private ArrayListselectImageInfos = new ArrayList(); 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 imageInfos) { if (selectImageInfos!=null){ selectImageInfos.clear(); }else { selectImageInfos = new ArrayList(); } 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 bucketIds, List bucketInfoList) { bucketInfos = bucketInfoList; bucketAdapter = new BucketAdapter(GalleryActivity.this,bucketInfoList); bucketLV.setAdapter(bucketAdapter); } }); bucketLoaderTask.execute(); } private class GridAdapter extends BaseAdapter{ private ListimageInfos; public GridAdapter(ListimageInfos){ 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 ListbunketInfos= new ArrayList(); private List tempImageInfos = new ArrayList(); 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> map =new HashMap>(); 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 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 ListbucketIds = new ArrayList();///存储所有的相册id private ListbucketInfoList = new ArrayList(); 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(ListbucketIds ,List 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 ListbucketInfoList; private Context mContext; public BucketAdapter(Context context,ListbucketInfoList){ 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
更多相关文章
- [Android] 获取照片(相机,相册)
- Android开发实践:自己动手编写图片剪裁应用(3)
- Android 图片压缩详解
- Android逐帧动画——让图片动起来
- Android中,如何实现在图片上添加返回功能
- Android大图片之缩略图,以及对原图按照指定宽高裁剪成缩略图
- Android 使用Picasso加载网络图片等比例缩放
- 最全的android图片加密