9月4日 2009
【Android】Photo Gallery Plusを公開します。Intentも。
Androidに標準でインストールされているギャラリーは画像を見るだけでなく、他のアプリケーションが画像を必要とする時にIntentにより起動され、画像を渡したり、Intentに仕込まれたパラメータによって縦横比やサイズを指定して切り抜いた後、返したりできます。
そこでAndroidならではと思いつき、SDカードに登録されている画像と同じようにFlickrにアップロードされている画像を他のアプリに渡したり、切り抜きが必要な場合には切り抜き用ウィンドウを利用して加工した後返したりできるアプリを作りました。
とりあえず電話帳に画像を登録する時や、Gmailに添付ファイルとして画像を選択するような時に使えるかと思います。
図解できればいいのですがセンスがないのでやめときます。
要は、
1) Intent.ACTION_GET_CONTENTを横取りして、画像をSDから選ぶかFlickrから選ぶかユーザーに選択させる
2) SDを選ぶと標準のギャラリーに移動。Flickrから選びたいときは検索をかける
3) 検索結果はWebViewに表示。
4) 欲しいのがあればタップすると画像を選択するか、ダウンロードのみ行うか、クリップボードにタイトルやURLをコピーするかなど選べます。ダウンロード完了後は起動されたIntentに仕込まれたパラメータによりそのままのサイズで返すか、縦横比やサイズが指定された場合はそれをもとに画像切り抜きウィンドウを表示。切り抜き完了後、データを返す。
という感じです。
また、GET_CONTENTに反応するだけでなく通常のギャラリー&写真ダウンローダーとしても機能します。
開発者の方へ。
Intentを公開しますのでお好きにご利用ください。ユーザーに画像を選択させ、それを指定したサイズで自分のアプリに引っ張ってくることが可能になります。
起動したい時は、
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); intent.setComponent(new ComponentName("biz.stachibana.flickr.picker","biz.stachibana.flickr.picker.InitialActivity"));
が必須です。
切り抜きをしてから返して欲しいときは、上記に加え
intent.setType("image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 96); intent.putExtra("outputY", 96); intent.putExtra("return-data", true);
こういう感じで。
例外は省きますが、ActivityNotFoundExceptionをキャッチした時はコンポーネントネームを外してAction.GET_CONTENTのみをつけてやれば標準のギャラリーが処理を行うことになります。戻り値の型は合わせてありますのでPhoto Gallery PlusがインストールされていなくてもSDの中からでしたら画像を引っ張れます。
帰ってきた時ですが、切り抜き無しの時は以下の様にして取れます。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode)
{
case YOUR_REQUEST_CODE:
if(resultCode == RESULT_OK)
{
Uri uri = data.getData();
InputStream is;
try {
is = getContentResolver().openInputStream(uri);
Bitmap bmp = BitmapFactory.decodeStream(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
}
}
切り抜き用Extraを付けた時は処理を委譲しますので受け取り方が変わります。下記の通り。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
switch (requestCode) {
case YOUR_REQUEST_CODE: {
final Bundle extras = data.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
}
break;
}
}
}
で、あとはお好きなようにしてください。
本来はもうすぐ発売になるAndroidを乗せたSmartQ5用のフォトアルバムを作ろうと思って始めたのでそちらの実装が済むまでマーケットには上げませんので興味のある方は以下のリンクからダウンロードしてみてください。
また、Photo Gallery Plusから画像を引っ張るアプリのサンプルをアップしておきますのでもし興味のある方は見てみて下さい。Photo Gallery Plusとサンプルアプリがあれば雰囲気は掴んでもらえるかと思います。
しかしこのアプリ、はてなフォトライフとかにも対応して欲しいとか言われそうだなあ。きりがないし他にも作りたいのがあるのでそちらに移りたいのだけれど。サーバーはGAEなので大サイズの画像はダウンロードさせたくないし。
どうしようか。
以下、スクリーンショット貼っておきます。


最近のコメント