1. 程式人生 > >Android 仿微信影象拍攝和選擇介面

Android 仿微信影象拍攝和選擇介面

外掛執行後的畫面如下:
下面這張圖對影象進行篩選,根據照片產生的源頭分(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)