插件下载地址: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)