GalleryActivity读取本地相册及照片 能够按相册区分 并选取照片
2015-10-27 21:17
441 查看
先看效果图
1 读取本地照片
![](https://img-blog.csdn.net/20151027210923286?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2 查看本地的相册,以及其中照片信息
![](https://img-blog.csdn.net/20151027211023506?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3 选择一个相册,查看其中照片
![](https://img-blog.csdn.net/20151027211101274?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
4 选取照片进行操作或者上传
![](https://img-blog.csdn.net/20151027211146269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
5查看自己选择的照片
![](https://img-blog.csdn.net/20151027211213530?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
下面来看具体的实现
其中最主要的是GalleryActivity,也就是刚开始照片的布局,以及相册的布局
下面的这个是加载本地照片的Task
下面的是加载相册的task
相册的Adapter
下载地址 http://download.csdn.net/detail/renlei0109/9218405
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
相关文章推荐
- Material Design Support Library中NavigationView添加下划线
- android.view.InflateException: Binary XML file line #247: Error inflating class <unknown>
- 【Android学习笔记】属性动画基础学习笔记
- 不可不知的android开发冷知识1
- [Android Pro] Android 4.1 使用 Accessibility实现免Root自动批量安装功能
- Android Studio新手指引
- android 59 LinearLayout 线性布局
- android复习第一天-----简单的android常识
- Android so文件进阶 <一>
- 对Android为intent提供两种传递对象参数类型的方法的个人简单理解
- Android4.2多用户模式的结构与实现
- Android L Settings 简要分析
- Android 生成图标的有力工具 Android Asset Studio
- Android Studio 使用lint工具进行代码优化
- Activity与DialogFragment交互的方法
- AndroidStudio用法总结
- Android:CoordinatorLayout使用详解
- Android onActivityResult不返回resultCode和intent
- Android 状态栏透明
- Android设计模式系列--模板方法模式