1. 程式人生 > >多選本地相簿中的圖片並展示(仿QQ空間動態傳送頁面)上傳至伺服器

多選本地相簿中的圖片並展示(仿QQ空間動態傳送頁面)上傳至伺服器

最近公司專案需要從本地上傳圖片到伺服器,直接去找才發現安卓居然還有這麼坑的時候,呼叫原生的只能選擇一張圖片,而且還沒有任何的細節優化,觸控圖片就直接返回了。這肯定不行啊!於是就在網上找啊找。。。找啊找。。。有很多都寫得花裡胡哨的看不懂,而且介面的UI也是low的不行。。終於還是找到一個很好的demo,仿照QQ空間的樣式。哎,這就很舒服。在此貼上來給自己一個提醒。

參照上一篇部落格直接作為moudle匯入使用才是真的美滋滋~~

http://www.cnblogs.com/linjzong/p/4629800.html

前段時間在做一個動態釋出功能,需要用到圖片上傳。一開始直接呼叫的系統相簿和相機,由於系統相機不支援多選,就花點時間做了個本地相簿,在此開源下。

先上截圖,依次為選擇相簿介面、相簿詳情介面、檢視圖片大圖介面

  

相簿列表按圖片數量降序排序,相簿詳情列表按圖片時間降序排序,對比了下微信和QQ的相簿,讀取的檔案基本一致。

接下來說下相簿檔案遍歷的思路。首先肯定不會是通過資料夾逐級遍歷的,這樣效率太低。查了下API發現Android的系統資料庫已經儲存了所有的圖片路徑和縮圖路徑(如果有),可直接通過ContentProvider來獲取,獲取大圖的URI是

MediaStore.Images.Media.EXTERNAL_CONTENT_URI

獲取縮圖的URI是

MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI

我的做法是先遍歷所有大圖,獲取ID和路徑,再通過大圖的ID去查詢縮圖路徑,在相簿中顯示的都是縮圖,這樣可以提高顯示速度,同時減少記憶體開銷。但是通過大圖ID去查詢縮圖這一步是需要消耗一點時間的,因此將它在App啟動時,開啟執行緒執行。LocalImageHelper類用以執行該操作。

待完善點:相簿的初始化是放在應用啟動時,初始化一次後就不再重新執行,因此假如在應用開啟後,裝置內添加了新的圖片或刪除了圖片,應用內快取的相簿仍然不會改變,下一步可以在每次開啟相簿時和本地圖片做一次對比,對新增的和刪除的圖片做一個更新。

Demo中使用了ImageLoader庫來展示圖片,使用的是Android Studio開發。

demo中onActivityResult方法裡:


pathList就是我定義的一個集合用來存讀到的原圖的實體地址,因為展示的時候是縮圖但是你給伺服器傳送的話肯定要傳大圖,兩個log的列印如下:


拿到地址之後寫了個updateImage(String descript, List<String> list)方法

第一個引數是用來獲取傳送動態的EditText裡的內容,第二個list就是pathList


然後通過pathList去迴圈的建立新的圖片File物件存到一個list裡面去發給伺服器

params.setMultipart(true);

這句話一定要有,因為xutils的原理還是去模仿了瀏覽器表單的樣式去給伺服器傳送(目前我是這麼理解的),所以不設定為true的話伺服器是不能接受檔案的喲~~