mucchinのAndroid戦記

コンタクトリストの取得方法(Android SDK2.0以降の方法)

Contactsクラスでコンタクトリストを取得する処理が非推奨(deprecated)と警告されるけど、推奨方法は?

Android SDK1.6までは、コンタクトリスト(電話帳のデータ)を取得したり設定したりするのに、android.provider.Contactsクラスを使用していました。
しかし、Android SDK2.0(API Level5)以降は、このクラスは、クラス毎、非推奨になりました。


Android SDK付属のAPIリファレンスを見れば、何を使えばいいかわかります。
android.provider.Contactsクラスの冒頭に、以下のような記述があります。

私のつたない英語力で読むと、、、
新しいAPIでは、複数のアカウントや、似た名前?のコンタクトリスト内の複数のアカウントにアクセスが出来たりする。
これまでのAPIでも動作するけど、最初に作られたGoogleアカウントしか返さない・・・云々。
おそらく要は、機能改善か追加がされたという事なんでしょう。


というわけで、android.provider.Contactsクラスの代わりに使用するのは、上記の画像内にもありますが、android.provider.ContactsContractクラスを使う、という事ですね。


ほんのちょっと使ってみましたが、基本的な使い方はほとんど変わらないという印象です。
触りだけだからだと思いますが・・・。
適当に電話帳の一覧を取得する、というサンプルで、これまでの方法と比較してみます。


スポンサーリンク




android.provider.Contactsクラスを使用した場合

//名前、電話番号を取得する。
String[] proj = new String[]{
   People.NAME,People.NUMBER
};

Cursor c = managedQuery(
   People.CONTENT_URI,
   proj,
   People.NAME + ” like ?”,
   new String[]{ “mucchin%”},
   People.NAME + ” ASC”);
);


上は、電話帳より、名前に「mucchin」と頭に付く人の名前と電話番号を、名前の昇順で取得する、という処理です。
ちなみに、「People」は、android.provider.Contactsクラスのネストクラスです。

これを、推奨の方法で書き換えると、以下のようになります。

android.provider.ContactsContractクラスを使用した場合

String[] proj = new String[]{
   Contacts.DISPLAY_NAME,
   Contacts.HAS_PHONE_NUMBER
};

Cursor c = managedQuery(
   Contacts.CONTENT_URI,
   proj,
   Contacts.DISPLAY_NAME + ” like ?”,
   new String[]{“mucchin%”},
   Contacts.DISPLAY_NAME + ” ASC”
);


ほとんど一緒ですね。
上記ソース内に出てくる「Contact」ですが、これはandroid.provider.Contactsではなく、android.provider.ContactsContractのネストクラスです。

というわけで、違うところが、android.provider.Contacts.Peopleではなく、android.provider.ContactsContract.Contactを使うように変わった、というところだけです。


細かい使い方は、もっと違う点があると思いますが、基本的には一緒のような使い方で実装できるのかなと思いました。
APIリファレンスをよく読んで、使いこなしてみてください。