ContentResolverで画像を読み込む
ついに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を得るコードです。
こんな感じで画像が取得できます!
