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

本文介绍了一个照片管理与预览应用的实现过程,包括读取本地照片、查看相册及选择照片的操作。通过使用GalleryActivity布局展示照片和相册,并实现图片加载、相册加载及选择照片的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看效果图

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.youkuaiyun.com/detail/renlei0109/9218405

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值