Android 仿微信图像拍摄和选择界面

插件下载地址:http://pan.baidu.com/s/1bUHyrW


插件运行后的画面如下:
下面这张图对图像进行筛选,根据照片产生的源头分(QQ和微信和相机)
这里写图片描述


点击某文件夹后,可以查看该文件夹下包含的所有的图片
这里写图片描述


图片选择界面


这里写图片描述


选中后就跳到已经选择界面的窗口,并且可以对该吃图片上传进行简要的描述

这里写图片描述


首先我想说明的是这个插件默认是不进行图片筛选的,打开app后会有几十个文件夹,但是个人认为开发中常用的图片基本都来自于QQ中拍摄的照片,微信中拍摄的照片,以及相机直接拍摄的照片,因此我对这个插件进行过滤以及文件夹名称的更改,具体做法,主要是对AlbumHelper类buildImagesBucketList方法中的do-while循环进行稍微修改

这里写图片描述


AlbumHelper这个类也是单例模式
这里写图片描述


默认这个插件图片选择界面的完成按钮只显示一半,因此要对布局界面做一个简单的修改


这里写图片描述


通过cur.moveToNext()遍历的每一张图片的众多属性中有四个是非常重要的,分别如下:

name: 图片的名字
path: 图片的访问路径
buckt:图片所在文件夹的名称
bucketId:用一个索引值唯一标识图片所在的文件夹

下面是随机的一张图片的这四个属性的打印的结果:
// name:IMG_20170120_151602.jpg
// path:/storage/3034-6132/DCIM/Camera/IMG_20170120_151602.jpg
// bucket: Camera
// bucketId: -904037720   

这里写图片描述

在上面的这张图片中,使用一张HashMap<文件夹ID,文件夹对象>来管理所有的图片,查找图片所在的文件夹也非常方便


图片收集这个类也是单实例的:

这里写图片描述


获取所有图片信息,倚赖getImagesBucketList这个方法,而这个方法的内部具体思路如下:
这里写图片描述



AlbumHelper类,很多部分都是多余的或者作者搞测试用的,因此对该类做一下整理,如下:

package com.example.testpic;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import android.R.string;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore.Audio.Albums;
import android.provider.MediaStore.Images.Media;
import android.provider.MediaStore.Images.Thumbnails;
import android.util.Log;

/**
 * 专辑帮助类
 */
public class AlbumHelper {
    final String TAG = getClass().getSimpleName();
    Context context;
    ContentResolver cr;

    // 缩略图列表
    HashMap<String, String> thumbnailList = new HashMap<String, String>();

    HashMap<String, ImageBucket> bucketList = new HashMap<String, ImageBucket>();

    private static AlbumHelper instance;

    private AlbumHelper() {
    }

    public static AlbumHelper getHelper() {
        if (instance == null) {
            instance = new AlbumHelper();
        }
        return instance;
    }

    public void init(Context context) {
        if (this.context == null) {
            this.context = context;
            cr = context.getContentResolver();
        }
    }

    boolean hasBuildImagesBucketList = false;
    void buildImagesBucketList() {
        long startTime = System.currentTimeMillis();

        // 构造相册索引
        String columns[] = new String[] { Media._ID, Media.BUCKET_ID,
                Media.PICASA_ID, Media.DATA, Media.DISPLAY_NAME, Media.TITLE,
                Media.SIZE, Media.BUCKET_DISPLAY_NAME };
        // 得到一个游标
        Cursor cur = cr.query(Media.EXTERNAL_CONTENT_URI, columns, null, null,
                null);
        if (cur.moveToFirst()) {
            // 获取指定列的索引
            int photoIDIndex = cur.getColumnIndexOrThrow(Media._ID);
            int photoPathIndex = cur.getColumnIndexOrThrow(Media.DATA);
            int photoNameIndex = cur.getColumnIndexOrThrow(Media.DISPLAY_NAME);
            int photoTitleIndex = cur.getColumnIndexOrThrow(Media.TITLE);
            int photoSizeIndex = cur.getColumnIndexOrThrow(Media.SIZE);
            int bucketDisplayNameIndex = cur
                    .getColumnIndexOrThrow(Media.BUCKET_DISPLAY_NAME);
            int bucketIdIndex = cur.getColumnIndexOrThrow(Media.BUCKET_ID);
            int picasaIdIndex = cur.getColumnIndexOrThrow(Media.PICASA_ID);
            // 获取图片总数
            int totalNum = cur.getCount();

            do {
                String _id = cur.getString(photoIDIndex);
                String name = cur.getString(photoNameIndex);
                String path = cur.getString(photoPathIndex);
                String title = cur.getString(photoTitleIndex);
                String size = cur.getString(photoSizeIndex);
                String bucketName = cur.getString(bucketDisplayNameIndex);
                String bucketId = cur.getString(bucketIdIndex);
                String picasaId = cur.getString(picasaIdIndex);         
                if (bucketName.equals("Camera") || bucketName.equals("WeiXin")) {
                    if (path.contains("storage/emulated/0")
                            && bucketName.equals("Camera")) {
                        bucketName = "QQ";
                    }
                    if (path.contains("storage/emulated/0")
                            && bucketName.equals("WeiXin")) {
                        bucketName = "微信";
                    }
                    if (!path.contains("storage/emulated/0")
                            && bucketName.equals("Camera")) {
                        bucketName = "相机";
                    }

                    ImageBucket bucket = bucketList.get(bucketId);
                    if (bucket == null) {
                        bucket = new ImageBucket();
                        bucketList.put(bucketId, bucket);
                        bucket.imageList = new ArrayList<ImageItem>();
                        bucket.bucketName = bucketName;
                    }
                    bucket.count++;
                    ImageItem imageItem = new ImageItem();
                    imageItem.imageId = _id;
                    imageItem.imagePath = path;
                    String ppp=thumbnailList.get(_id);
                    imageItem.thumbnailPath = ppp;              
                    bucket.imageList.add(imageItem);
                }

            } while (cur.moveToNext());
        }


    }

    /**
     * 得到图片集
     */
    public List<ImageBucket> getImagesBucketList(boolean refresh) {
        if (refresh || (!refresh && !hasBuildImagesBucketList)) {
            buildImagesBucketList();
        }
        List<ImageBucket> tmpList = new ArrayList<ImageBucket>();
        Iterator<Entry<String, ImageBucket>> itr = bucketList.entrySet()
                .iterator();
        while (itr.hasNext()) {
            Map.Entry<String, ImageBucket> entry = (Map.Entry<String, ImageBucket>) itr
                    .next();
            tmpList.add(entry.getValue());
        }
        return tmpList;
    }

}

FR:海涛高软(QQ技术群:386476712)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值