先看效果图

1 读取本地照片

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

GalleryActivity读取本地相册及照片 能够按相册区分 并选取照片_第1张图片

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

GalleryActivity读取本地相册及照片 能够按相册区分 并选取照片_第2张图片


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

GalleryActivity读取本地相册及照片 能够按相册区分 并选取照片_第3张图片


5查看自己选择的照片


GalleryActivity读取本地相册及照片 能够按相册区分 并选取照片_第4张图片



下面来看具体的实现

其中最主要的是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

更多相关文章

  1. [Android] 获取照片(相机,相册)
  2. Android开发实践:自己动手编写图片剪裁应用(3)
  3. Android 图片压缩详解
  4. Android逐帧动画——让图片动起来
  5. Android中,如何实现在图片上添加返回功能
  6. Android大图片之缩略图,以及对原图按照指定宽高裁剪成缩略图
  7. Android 使用Picasso加载网络图片等比例缩放
  8. 最全的android图片加密

随机推荐

  1. Python学习/复习神器-->各种方法/技巧在哪
  2. Python:Sympy定义与包含变量的边界的积分
  3. 25行Python来反求触地位移模拟滚动
  4. python 之 自制测试框架
  5. 自学Python五 爬虫基础练习之SmartQQ协
  6. Python入门:内置函数
  7. python的接口实现zope.interface示例
  8. dev-server HTTP错误403:禁止
  9. (四)OpenCV-Python学习—形态学处理
  10. [Python设计模式] 第1章 计算器——简单