close
一個Bug找三天。如果可以,我也想要10倍返しなるか!
還要要怪怪自己,大多數的錯還是在於觀念上的不清晰,就下去亂寫,最後寫成一坨一坨的Bug陣列。只好花更多的時間,在紙上寫整個架構,順序該如何,再來下程式碼。儘管如此,還是會有call錯東西的可能性,需要花時間找出問題來,看到"Unfortunately, xxx has stopped.",頓時整個火都上來了。只能想想吳寶春的話,跑不出來表示還不夠努力,聊以慰己。

上周五挑戰相簿取圖,取到縮圖(Thumbnails),依照順序放到畫面上的GridView去,其中涉及許多觀念:

1. 用ContentResolver去把縮圖全部叫(query)出來,得到Cursor,其中,縮圖的資料表格放在EXTERNAL_CONTENT_URI裡,每張縮圖,都有各自的縮圖ID (_ID),縮圖圖檔ID(IMAGE_ID),對應的原圖(Media.IMAGE_ID)。

Cursor c = getContentResolver().query(Thumbnails.EXTERNAL_CONTENT_URI, null, null, null, null);
2. 知道了會query出一堆圖檔的資料,每張圖都有各自的ID, 縮圖ID, 檔案名稱,為了整理,我們把各自的欄位資料分類,放在ArrayList裡面,依照資料型態放字串或是整數。設定好幾個空的資料包包(ArrayList),之後資料取到再放進去就可以。

ArrayList<Integer> thumbIds = new ArrayList<Integer>(); 縮圖ID是整數的資料型態ArrayList<String> imageIds = new ArrayList<String>(); 原圖ID是字串的資料型態ArrayList<String> filenames = new ArrayList<String>(); 檔案名稱是字串的資料型態


3. Cursor原始設定在座標原點,沒有對到資料值,所以需要用moveToNext往下一張一張讀資料出來。

while (c.moveToNext()){ 用moveToNext往下一張一張讀資料出來
int id = c.getInt(c.getColumnIndex(Thumbnails._ID)); 用欄位名稱_ID,去找這筆資料去得到縮圖的IDthumbIds.add(id); 把該張縮圖id,收集到叫做thumbIds的ArrayList中,依次movetonext就收齊全部圖的縮圖idString imageId = c.getString(c.getColumnIndex(Thumbnails.IMAGE_ID)); 用欄位名稱IMAGE_ID去找到原圖的IDimageIds.add(imageId); 把該張原圖id,收集到叫做imageIds的ArrayList中,依次movetonext就收齊全部圖的原圖id


4. 縮圖和原圖的ID在Thumbnails裡的EXTERNAL_CONTENT_URI表格中都取到了之後,下一步就要去原圖的資料夾取檔案名稱(Media.DISPLAY_NAME)和原圖資料了。

Cursor c2 = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, null,去原圖的資料表格把資料叫出來Media._ID+"=?", 原圖在Thumbnails資料表格中,ID叫做IMAGE_ID,而在原圖Media的資料表格(Media.EXTERNAL_CONTENT_URI)中,就是Media._ID本身+縮圖表格中IMAGE_ID所對應到的那張圖,所以是_ID+"=?",?是變數,由下一變數欄依序把參數丟進去
new String[]{imageId+""}, ?表示每一張圖對應的原圖在縮圖資料表格中的ID(IMAGE_ID)null);if (c2.moveToNext()){ 用moveToNext往下一張一張讀資料出來MainActivity.this.filenames.add(c2.getString(c2.getColumnIndex(Media.DISPLAY_NAME)));把圖檔的檔名在原圖資料夾中讀出來(DISPLAY_NAME)


5. 東西都整理完了,下一篇就來準備用Adapter丟到畫面中。


未完,待續。

arrow
arrow
    全站熱搜

    brianc18 發表在 痞客邦 留言(0) 人氣()