2012/04/24

Intentを使いギャラリーで画像を表示する

トラノマキでSDカード内に配置された画像を表示するだけビューがあります。これは何の変哲もないImageViewで、表示する以外の機能は無いのですが、ユーザーが画像を拡大して見たくなる場合もあるだろうと考え、他の画像ビューア(ギャラリー等)にインテントを投げるという実装を試みました。

有名なファイルマネージャ『アストロビューア』で画像ファイル名をクリックしたときのあの動作です。

ところがこういったサンプルがありそうでなかなか見つからず(調べ方が悪いのか需要が無いのか)おかげで3日くらい苦しみましたが、アストロビューアのLogCatを眺めていたところ解決に至りました。

ちなみに日本Androidの会メーリングリストで同じ悩みを持っている人が居て(未解決でしたが)、そのやりとりがヒントになりました。

前置きが長くなりましたが、以下がサンプルです(一部抜粋)


String filename = "SDカードのファイルパス";
//コンテンツプロバイダのURI取得
Cursor c = getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.ImageColumns.DATA + " = ?", new String[]{filename}, null); 
c.moveToFirst(); 
String contentname = "content://media/external/images/media/" + c.getInt(c.getColumnIndex(MediaStore.MediaColumns._ID)); 
   
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(contentname));
 
startActivity(intent);


3-5行でファイルパスからコンテンツプロバイダのURIを取得しています。コンテンツプロバイダに登録されていないファイルの場合nullが返されるので例外処理を書いた方がいいかもしれません。

自前アプリで作成・保存した、あるいはダウンロードした等のケースではコンテンツプロバイダに登録されてないので、MediaScannerConnection を使ってコンテンツプロバイダに登録させる処理が必要になります。

詳細は以下のURLを参照しください。


参考URL

MediaScannerConnectionを使って画像をギャラリーに反映させる http://techbooster.jpn.org/andriod/multimedia/5341/

contentスキーマとfileスキーマの相互変換 http://yagni.jp/android/interconversion_between_file_and_content

Android URI
http://ee72078.moo.jp/chinsan/pc/MobileApp/index.php?Android%20URI

0 件のコメント:

コメントを投稿