著手實現(xiàn)一個圖片選擇器-PhotoPicker

相信很多朋友在開發(fā)安卓App時都會有這樣需求,圖片選擇或拍照選擇,需求實現(xiàn)很簡單,如下:

  • 圖片選擇:調用系統(tǒng)圖庫進行選擇
  • 拍照選擇:調用系統(tǒng)相機進行拍照

看了上面的實現(xiàn)后發(fā)現(xiàn)很容易啊,都有現(xiàn)成的調用;但我們錯了,對于產品的BT需求,我們遠遠無法這么簡單的滿足,比如:圖片多選上傳了?額,這個時候我們調用系統(tǒng)的圖庫就蒙B了,因為系統(tǒng)圖庫并不支持多選;那怎么辦了?不急,請慢慢往下看,這就是這篇Blog的意義所在,定義一個自己的圖片選擇器

本項目已經開發(fā)完畢了,下面是相應的地址
GitHub:https://github.com/JaySong/PhotoPicker
Gradle引用:'com.jay.ui:photopicker:last-version';目前版本:1.0.0
此工程實現(xiàn)的功能:

  1. 圖片的單選或多選<可自定最大選擇數量>
  2. 可根據不同圖片文件夾進行篩選
  3. 圖片的預覽
  4. 相機拍照選擇
    總結:微信選擇圖片的功能基本都有,可滿足大部分需求,UI界面采用MD風格設計

需要解決的技術問題

  1. 得到手機中所有的圖片并顯示在列表
  2. 實現(xiàn)列表的單選或多選

1.得到手機中所有的圖片并顯示在列表

實現(xiàn):采用LoaderManager.LoaderCallbacks<Cursor>時行圖片的查詢,下面見核心代碼
PS:當前需要實現(xiàn)加載的類可實現(xiàn)此接口或自己自定義一個類實現(xiàn)此接口

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
@SuppressWarnings("UnnecessaryLocalVariable")
CursorLoader cursorLoader = new CursorLoader(
this,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME},
"mime_type=? or mime_type=?" + (isShowGif ? "or mime_type=?" : ""),
isShowGif ? new String[]{"image/jpeg", "image/png", "image/gif"} : new String[]{"image/jpeg", "image/png"},
MediaStore.Images.Media.DATE_ADDED + " DESC"
);
return cursorLoader;
}

>getLoaderManager().initLoader(int,Bundle, LoaderManager.LoaderCallbacks);

通過此方法進行初始化,如果要兼容到11以下的系統(tǒng),調用
getSupportLoaderManager()..initLoader(int,Bundle, LoaderManager.LoaderCallbacks);

onCreateLoader()方法是接口中必須實現(xiàn)的方法;

new CursorLoader(Context context,
Uri uri, //查詢的Uri
String[] projection, //列名
String selection,//查詢條件
String[] selectionArgs, //查詢條件中的參數
String sortOrder)//排序規(guī)則

onLoadFinished(Loader<Cursor> loader, Cursor data)方法會在查詢完成后回調,其中data就是我們想要的結果就在此對象中

if (data.moveToFirst()) {
do {
String photoDir = data.getString(data.getColumnIndex(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME));
String photoUri = data.getString(data.getColumnIndex(MediaStore.Images.Media.DATA));
} while (data.moveToNext());
}
//photoDir:當前圖片所在的目錄名
//photoUri:當前圖片的路徑


2.實現(xiàn)列表的單選或多選

列表的顯示是使用控件RecyclerView實現(xiàn)展示,圖片選中控件是使用CheckBox來進行圖片的選擇標識,具體請查看源碼PhotoPickerActivity.PhotoListAdapter適配器類

拍照并顯示至列表

實現(xiàn)方式:同樣調用系統(tǒng)相機

//用戶要拍照
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePhotoFile = createImageFile();
// Continue only if the File was successfully created
if (takePhotoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(takePhotoFile));
startActivityForResult(takePictureIntent, TAKE_PHOTO);
} else {
showSnackBar(getString(R.string.open_camera_fail));
}
//其中createImageFile()返回一個文件File,即拍照后保存的路徑

拍照成功需要更新列表,這個時候我們做一個操作即可,那就是提醒系統(tǒng)更新媒體庫

public void notifyMediaUpdate(File file) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
}
//這樣操作后,我們前面實現(xiàn)的加載器會自動去加載新的數據,參數file就是我們之前拍照前保存的保存路徑

下面上一張演示圖

1.gif
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末腌紧,一起剝皮案震驚了整個濱河市备燃,隨后出現(xiàn)的幾起案子呜叫,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汉买,死亡現(xiàn)場離奇詭異赖欣,居然都是意外死亡,警方通過查閱死者的電腦和手機映凳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門胆筒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诈豌,你說我怎么就攤上這事仆救。” “怎么了矫渔?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵彤蔽,是天一觀的道長。 經常有香客問我庙洼,道長顿痪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任油够,我火速辦了婚禮蚁袭,結果婚禮上,老公的妹妹穿的比我還像新娘石咬。我一直安慰自己揩悄,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布鬼悠。 她就那樣靜靜地躺著删性,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焕窝。 梳的紋絲不亂的頭發(fā)上蹬挺,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音它掂,去河邊找鬼巴帮。 笑死,一個胖子當著我的面吹牛虐秋,可吹牛的內容都是我干的晰韵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼熟妓,長吁一口氣:“原來是場噩夢啊……” “哼雪猪!你這毒婦竟也來了?” 一聲冷哼從身側響起起愈,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤只恨,失蹤者是張志新(化名)和其女友劉穎译仗,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體官觅,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡纵菌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了休涤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咱圆。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖功氨,靈堂內的尸體忽然破棺而出序苏,到底是詐尸還是另有隱情,我是刑警寧澤捷凄,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布忱详,位于F島的核電站,受9級特大地震影響跺涤,放射性物質發(fā)生泄漏匈睁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一桶错、第九天 我趴在偏房一處隱蔽的房頂上張望航唆。 院中可真熱鬧,春花似錦院刁、人聲如沸糯钙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸳玩,卻和暖如春阅虫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背不跟。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工颓帝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窝革。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓购城,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虐译。 傳聞我的和親對象是個殘疾皇子瘪板,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容