由於 Android 並沒有一種標準方式讓程式設計師可以叫出多選圖片的視窗 , 僅有單選 , 是利用 Intent.ACTION_PICK 叫出圖片瀏覽器。若要讓使用者可以多選圖片,必須自己實作一個圖片瀏覽器,並自己定義一個 ACTION 自己用,但是要作一個好的圖片瀏覽器實在是要費很大的功夫。
因此我研究了市占率最高的 Galaxy3D 及 HTCAlbum 這兩套在手機中通常會內建的圖片瀏覽器怎麼送出多選的 Action ,研究這些也讓我學到如何反編譯 Android 的 APK ,算是收穫很大,Galaxy 3D 在 Samsung 或 Sony 的手機大都有內建,HTCAlbum 是 HTC 手機的,因此若不想很麻煩自己寫一套,大概呼叫這兩套出來多選,應該至少一半以上手機都可以多選,其它的手機就只提供單選圖片,以下就列出我的實作方式,我沒有寫很完整,但若寫過處理單選圖片的設計師應該會看得懂的。
Galaxy 3D
只要送出 "android.intent.action.MULTIPLE_PICK" 就行了,程式碼如下 , 注意我用了 Try catach , 這樣可以讓你的程式知道系統內沒有一套 App 有支援 android.intent.action.MULTIPLE_PICK , 那麼您就可以作其他事情 , 或繼續嘗試呼叫 HTCAlbum 的 ACTION
intent.setType("image/*"); // 這是 Intent 物件設定只要選圖片 intent.setAction("android.intent.action.MULTIPLE_PICK"); try { startActivityForResult(intent, 0); return true; } catch(ActivityNotFoundException e) { return false; }
HTCAlbum
以下程式碼是送出 com.htc.album.ACTION_PICK_NF_MULTIPLE_ITEM , 但 HTCAlbum 還有一個 com.htc.HTCAlbum.action.MULTIPLE_ITEMS_PICKER_FROM_COLLECTIONS 似乎也可以用。
intent.setType("image/*"); intent.setAction("com.htc.album.ACTION_PICK_NF_MULTIPLE_ITEM"); try { startActivityForResult(intent, 0); return true; } catch(ActivityNotFoundException e) { return false; }
資料回傳
以上兩套若成功呼叫出多選的介面,使用者選完圖後,程式仍必須頗析回傳的資料,好佳在這兩套回傳的格式都一樣,程式碼如下
ArrayList paths = data.getExtras().getStringArrayList(Intent.EXTRA_STREAM); int len = paths.size(); for(int i=0; i<len; i++) { Uri u = (Uri)paths.get(i); // u 是 Uri , 處理方式如同處理單選檔案 , 可以透過下一行觀察到長怎麼樣子 Log.d("PATH" , u.toString()); }
上段程式碼中的 data 是 onActivityResult() 回傳的 Intent 資料,而上段並沒有去處理 Uri , 還必須將 Uri 轉換為真實的檔案路徑才可以,以下提供個副程式可以將 Uri 轉成絕對路徑
private String getFilePathFromUri(Uri u) { String filePath = null; String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(u, filePathColumn, null, null, null); while(cursor.moveToNext()) { int columnIndex = cursor.getColumnIndex(filePathColumn[0]); filePath = cursor.getString(columnIndex); } cursor.close(); return filePath; }
以上範例其實可以併用,讓程式先嘗試去叫出 Galaxy3D , 若失敗 , 再嘗試 HTCAlbum , 最後都不行就呼叫單選,這樣就不用自己寫個圖片瀏覽器啦。目前我只有知道這兩套的呼叫方式,因為沒有其他手機可以玩,若有同好有不同的內建瀏覽器,可以互相交流一下,將這些未公布的秘密整合起來造福大家。