Android 仿微信影象拍攝和選擇介面
阿新 • • 發佈:2019-02-15
外掛執行後的畫面如下:
下面這張圖對影象進行篩選,根據照片產生的源頭分(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)