Android 呼叫內建圖片瀏覽器多選方式

由於 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 , 最後都不行就呼叫單選,這樣就不用自己寫個圖片瀏覽器啦。目前我只有知道這兩套的呼叫方式,因為沒有其他手機可以玩,若有同好有不同的內建瀏覽器,可以互相交流一下,將這些未公布的秘密整合起來造福大家。

 

 

 

發佈留言