kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

Content Providerで画像を列挙する

単純に画像を選択するだけなら、Intentを使ってアクティビティ(通常はギャラリー)を起動して結果を受け取るのが楽ですが、これだとやっぱり細かい制御ができないよね、ってことで、Content Provider経由で画像を列挙して見ます。

リファレンス

Androidの開発者ガイドを参考にします。また、画像を列挙するので、MediaStore.Images.Mediaを中心に参照します。

データの列挙

開発者ガイドを眺めると、表が出てきて、行やら列やらに言及されていて、なんのこっちゃ?という感じですが、要するにContent ProviderではRDBのようにテーブル(表)でデータを管理していて、アクセスもSQL文のような感じで行うよって事です。

そのためか、データを取得する際のメソッドはquery、引数の説明などもSQLに準じて行われます。

String[] projection = {
  Media.DISPLAY_NAME // ファイル名
  };

Cursor cur = Media.query(getContentResolver(),
                         Media.EXTERNAL_CONTENT_URI,
                         projection);
if (cur != null) {
  while (cur.moveToNext()) {
    Log.d("EnumImages", cur.getString(0));
  }
}

queryの呼び出しはgetContentResolver().queryでもよいし、Media.queryでも良いです。ただ、Images.Mediaではそうでもないですが、Images.Thumbnailsなどを見ると引数が調整されたqueryメソッドが準備されていたり、ダイレクトにデータにアクセスできるメソッドが準備されているので、コンテンツに特化したものを使ったほうがコードがシンプルになりますね。

ちなみにqueryメソッドはwhere引数が不正だった場合に例外が飛びます。未キャッチのエラーも無かったし、nullのエラーチェックもあるしってことで油断していたというか・・・はじめアプリが落ちる理由が分からなくて苦労しました。