ContentResolverで画像を読み込む

By daichi1128
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

ついにauからもandroidケータイが発表されました。
以下にきれいなお姉さんとともに紹介されています。
ついにZAURUSやNetWalkerの理想が実現、au初のAndroidスマートフォン「IS01」の実機ムービーいろいろ – GIGAZINE

んー。イイですね!

さて。今回は以前SDカードに画像保存をしましたが、読み込みをします。
ContentResolverでSDカードに画像保存 | Techfirm Android Lab

DBから読み込む

android内蔵のDBからデータの読み込みをしてみます。
大きくContext#managedQuery()とContentResolver#query()の2つのやり方がありますが、使い方は同じなので、ContentResolverの方で説明します。

ContentResolver | Android Developers

以下はContentResolverを使ったサンプルコードです。

ContentResoloverはContextオブジェクトのgetContentResolver()メソッドで取得できます。ここではActivityのgetContentResolverで取得しています。

queryメソッドは引数を5つとりますが、1つ目がUriです。
このUriでどのコンテンツなのかを指定します。この例ではSDカードの画像を取得したいので、
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
を指定しています。
第2引数以降は取得するカラムやselectする条件などを指定しますが、ここでは全てnullとして、全てのデータを取得しています。

queryメソッドからCursorオブジェクトが返されます。
Cursorオブジェクトは取得したデータへのアクセス手段を提供してくれます。

ResultSetのようなものです。

cursor.moveToFirst()で先頭行に移動した後、cursor.getCount()で取得できるレコード行数分ループ処理を行ってます。

Cursorからデータを取り出すにはデータの型に応じてcursor.getString()やcursor.getInt()を使いますが、引数には取得したいカラムのインデックスが必要です。
カラムのインデックスはcursor.getColumnIndex(”カラム名”)で取得できるので、この例ではカラム名からカラムインデックスを取得し、カラムの値を取得しています。

このコードを実行すると、SDカードに入っている画像データのメタデータが表示されます。

だいたいオリジナルの画像データは大きいので、個別にストリーム経由でBitmapを生成することになります。でないと多くの場合、お約束のOutOfMemoryになるでしょう。

画像を読み込む

上のコードで画像のIDが取得できるのですが、
URI + ID
でその画像データを表わすUriになります。

なので、
Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, “” + id)
# “” + idはint→String変換の手抜きです
などとして、画像のUriを求め、そのUriからBitmapFactoryで画像を生成します。

以下は取得したUriから適当に縮小したBitmapを得るコードです。

こんな感じで画像が取得できます!

関連する投稿