2011年4月24日 星期日

Android Intent Filters (hook android傳送圖片)

最近開始在寫android上頭的小ap,由於之前有在google appengine開發程式,所以就想將android手機端與雲端應用程式做一結合應用,花了時間整理一下,弄了個簡單的GAE blog,也順便新增傳送blob至GAE的功能,接著就想到讓手機可以把圖片由android手機傳送至gae,所以便找了一下該如何hook 手機傳送圖片的動作.
幸好沒一下子就找到網路上的文章分享 (http://eggie5.com/8-hook-share-picture-via-menu-android)
介紹開發步驟如下:
1.註冊 app w/將應用程式註冊到圖片分享的清單中(intent)
2.利用android API將相簿的圖片取出 (ContentResolver)
3.利用HTTP post將檔案傳送至其他web ap(外面的服務或自行撰寫的服務)

步驟一中的註冊須修改androidManifest.xml新增intent filter,範例如下:


package="com.eggie5" android:versionCode="1" android:versionName="1.0">

















步驟二則介紹由透過ContentResolver取得相簿圖片,原文範例如下,該範例將檔案取出作base64的編碼(這點可依據後面串接之服務作修改)

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Intent intent = getIntent();
Bundle extras = intent.getExtras();
String action = intent.getAction();

// if this is from the share menu
if (Intent.ACTION_SEND.equals(action))
{
if (extras.containsKey(Intent.EXTRA_STREAM))
{
try
{
// Get resource path from intent callee
Uri uri = (Uri) extras.getParcelable(Intent.EXTRA_STREAM);

// Query gallery for camera picture via
// Android ContentResolver interface
ContentResolver cr = getContentResolver();
InputStream is = cr.openInputStream(uri);
// Get binary bytes for encode
byte[] data = getBytesFromFile(is);

// base 64 encode for text transmission (HTTP)
byte[] encoded_data = Base64.encodeBase64(data);
String data_string = new String(encoded_data); // convert to string

SendRequest(data_string);

return;
} catch (Exception e)
{
Log.e(this.getClass().getName(), e.toString());
}

} else if (extras.containsKey(Intent.EXTRA_TEXT))
{
return;
}
}

}

步驟三則利用apache提供的httpclient發送http post將檔案傳送至後端的服務,這邊就請大家直接參考原文

沒有留言: