コンテンツプロバイダから連絡を取得する

個人的にアプリ作っていて、連絡先からデータを取得することに
なったので、その方法を記載。

Androidで連絡先から以下のデータを取得する場合
・名前
・電話番号
・メールアドレス

1. コンテンツプロバイダから名前を取得
2. コンテンツプロバイダから電話番号を取得
3. コンテンツプロバイダからメールアドレスを取得

と、段階を踏んで取得することになる。

ソースにすると、こんな感じ

// 出力する値の初期化
String familyNameText = Config.BLANK;
String nameText = Config.BLANK;
String number = Config.BLANK;
String email = Config.BLANK;

ContentResolver resolver = getContentResolver();
Cursor personCursor = resolver.query(
Uri.parse(returnedIntent.getDataString()), null, null, null,
null);
if (personCursor.moveToFirst()) {
// 名前、電話番号の取得
int idIndex = personCursor
.getColumnIndex(ContactsContract.Contacts._ID);
int nameIndex = personCursor
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);

String id = personCursor.getString(idIndex);
String name = personCursor.getString(nameIndex);

// 電話番号の取得
if (Integer
.parseInt(personCursor
.getString(personCursor
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor phoneCursor = resolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ? ", new String { id }, null);
while (phoneCursor.moveToNext()) {
number = phoneCursor
.getString(phoneCursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA1));
}
phoneCursor.close();
}

// メールアドレスの取得
Cursor mailCursor = resolver.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ? ",
new String{id}, null);
while(mailCursor.moveToNext()) {
email = mailCursor.getString(mailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1));
}
mailCursor.close();


個人的にミソなのは、
ContentResolver resolver = getContentResolver();
Cursor personCursor = resolver.query(
Uri.parse(returnedIntent.getDataString()), null, null, null,
null);
の部分。
こうすることで、連絡先で選んだ人のデータを取得できるようになる。

Uri.parseせずにURIを直で書いちゃうと連絡先を全部取得するようになる。
(DBにSELECT文投げるときにWHERE句無いイメージ)


コンテンツプロバイダは難しいね。。。