mucchinのAndroid戦記

Androidのコンテントプロバイダで使えるURI一覧(1)

getContentResolver().query()で指定できるURIってどんな種類があるの?

Androidでは、コンテントプロバイダという機能があります。
コンテントプロバイダとは、一言でいうと、Androidアプリが保持しているデータを、他のAndroidアプリが使えるようにする機能です。

例えば、通話ログ(着信履歴・発信履歴)、電話帳、ブラウザのブックマーク等、標準で実装されているAndroidアプリが持つデータも利用する事ができます。
これらのデータを利用するに際し、それぞれのデータを使えるようにするためには、getContentResolver().query()というメソッドで、目的のデータを示すURIを指定してCursorインスタンスを取得しなければなりません。

今回は、標準で実装されているAndroidアプリを示すURIを紹介していきたいと思います。
なお、紹介するURIは、現在の最新のリファレンスを元にしています。(以下URL参照)
Android APIリファレンス
これで非推奨となっているものは省きます。いつの間にか、Androidの最新バージョンが2.2になってる・・・。

この記事では、一つ一つの詳細な使い方は今回触れず、URIの一覧を紹介していきます。
調べたら、めちゃくちゃたくさんあるみたいなので、いくつかの記事に分けたいと思います。


CallLog.Calls.CONTENT_URI

着信履歴や発信履歴等の通話ログのデータにアクセスする為のURIです。
以下のパーミッションが必要です。
android.permission.READ_CONTACTS

ContactsContract.Contacts.CONTENT_URI

電話帳のデータにアクセスする為のURIです。
以下のパーミッションが必要です。
android.permission.READ_CONTACTS

ContactsContract.RawContacts.CONTENT_URI

これも、電話帳のデータにアクセスする為のURIのようです。
APIリファレンスは英文なので微妙なニュアンスを感じ取れないのですが、このRawContactsは、電話帳用のテーブル定義そのままの形でデータを取り扱える、という事ではないかと思います。
それに対し、先ほどのContactは、テーブル定義のままではなくて、いくつか他のテーブルも内部で結合させたり、実用性を考えて設計されているのかな?と思いました。
違ってたらすみません。
実際に実装したい機能が、「Contact」で実現できそうか、できなさそうなのであれば「RawContacts」で実装は出来ないか?を考えればよいと思います。

以下のパーミッションが必要です。
android.permission.READ_CONTACTS

ContactsContract.RawContactsEntity.CONTENT_URI

これもまた電話帳のデータにアクセスする為のURIです。
ContactsContract.RawContactsEntityクラスの概要を見ると、以下のような記述があります。
「Constants for the raw contacts entities table, which can be thought of as an outer join of the raw_contacts table with the data table. It is a strictly read-only table. 」
データベースが不得手な方には少々わかりにくい説明かもしれませんが、先ほど説明したContactsContract.RawContactsで取得できるテーブルと、その上で紹介したContactsContract.Contactsで取得できるテーブルを外部結合した一覧情報を取得できるという事なのでしょう。
SQLでいうと、実テーブル名は違いますが、以下のようなイメージだと思います。


select *
from ContactsContract.Contacts
outer join ContactsContract.RawContacts
  on ContactsContract.Contacts.ID = ContactsContract.RawContacts.ID
上記のようなイメージのSQLを元に仮想的な表を作成してデータを返しているだけなので、このURIで取得する情報に関しては、読み取り専用なんですね。きっと。
なぜこういうクラスがあるのか考えましたが、おそらく実際のテーブル名や仕様は、キレイな定義書を用意しているわけではないので、よく使われるであろうテーブル結合のパターンに応じて、こういうクラスがあるんだろうな、という推測です。
ちなみに、以下のパーミッションが必要です。
android.permission.READ_CONTACTS
スポンサーリンク




ContactsContract.Data.CONTENT_URI

これも電話帳のデータにアクセスする為のURIです。
今までに出てきたURIを使ってCursorインスタンスを取得すると、1アカウントにつき1レコードでしたが、このContactsContract.Data.CONTENT_URIを指定すると、1アカウントではなく、一つのデータに対して1レコードの結果が返されてくるようです。
例えば、自宅、携帯、仕事先の3つの電話番号を登録していた場合は、それぞれが別レコードで取得される、という事です。
使いやすい方を使えばいいと思います。
ちなみに、以下のパーミッションが必要です。
android.permission.READ_CONTACTS

ContactsContract.StatusUpdates.CONTENT_URI

先ほど、ContactsContract.Data.CONTENT_URIについて説明しましたね。
このContactsContract.StatusUpdates.CONTENT_URIは、上記の情報に紐付く情報のようです。
何の情報かと言いますと、「最新の状態」だそうです・・。
例えば「Skype」のアカウントに対するレコードであった場合、最後に受信したメッセージやタイムスタンプが取得できるのではないかなぁ?と推測するのですが、実機が無いので検証できません・・・。
もし興味があれば確かめてみてください。すみません・・・。
ちなみに、以下のパーミッションが必要です。
android.permission.READ_CONTACTS


以下はイマイチ用途は不明ですが、同じように使えるURIです。

ContactsContract.Settings.CONTENT_URI

ContactsContract.AggregationExceptions.CONTENT_URI

用途は不明ですが、動作はしたので紹介しておきます・・・。
但し、取得したレコード数を調べたら0でしたので、何が入ってくるテーブルなのかは不明です。
ContactsContract.Settingsの方は、「アカウント」という言葉がクラスの概要にあったので、もしかすると端末の設定にある「アカウントと同期の設定」で追加しているアカウントの情報が扱えるのかもしれません。
ちなみに、以下のパーミッションが必要です。
android.permission.READ_CONTACTS


Contact関連だけで、こんなにたくさんあるとは思いませんでした。
まだあるみたいなのですが、長くなってきたので、続きは次回にします。

ちなみに調べた手順は、APIリファレンスで「CONTENT_URI」で検索して、結果を一つ一つ試してみたというワケです。

なお、コンテントプロバイダで使えるURI一覧の他の記事は下記です。
Androidのコンテントプロバイダで使えるURI一覧(2)
Androidのコンテントプロバイダで使えるURI一覧(3)
Androidのコンテントプロバイダで使えるURI一覧(4)