Androidプログラマへの道 〜 Moonlight 明日香 〜 - コンタクトリストを取得する
電話番号やメールアドレスなどのコンタクトリストを取得するには, コンタクトコントラクト(ContactsContract)クラスとコンテントリゾルバ(ContentResolver)クラスを利用する. (API Level5以降)

コンタクトリストの取得

  • MainActivity.java
    • getContentResolverメソッドで, ContentResolverのインスタンスを取得する.
    • ContentResolver#queryメソッドで, 第1引数に"ContactsContract.Contacts.CONTENT_URI"を指定して, コンタクトリストを取得する.
    • Cursor#getCountメソッドで, データベースにヒットした件数を取得する.
    • Cursor#getColumnIndexメソッドで, 項目を指定してデータを取得する.
    • 電話番号/メールアドレスは複数保持可能な構成になっているので, ContentResolver#queryメソッドで, 第1引数に"ContactsContract.CommonDataKinds.Phone.CONTENT_URI"または"ContactsContract.CommonDataKinds.Email.CONTENT_URI"を指定し, 第3引数にidを指定して, データを取得する.
    • Cursor#closeメソッドで, クローズする.
package com.moonlight_aska.android.contactlist;

import java.util.Arrays;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;

public class MainActivity extends Activity {
  ArrayAdapter<String> mAdapter = null;
  ContentResolver mCResolver = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
    // コンタクトリストの取得
    mCResolver = getContentResolver();
    Cursor cursor = mCResolver.query(
        ContactsContract.Contacts.CONTENT_URI, // データの種類
        null, // 項目(null 全項目)
        null, // フィルタ条件(null フィルタなし)
        null, // フィルタ用パラメータ
        null  // ソート
      );
    Log.v("CONTACT", Arrays.toString(cursor.getColumnNames())); // 項目名一覧
    Log.v("CONTACT", "Num = " + cursor.getCount() ); // 取得件数
    if (cursor.moveToFirst()) {
      String id;
      String info;
      do {
        // ID
        id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        // 名前
        info = "名前:" + cursor.getString(cursor.getColumnIndex("display_name"));
        // 電話番号
        info += getPhoneNumber(id);
        // メールアドレス
        info += getEmailData(id);
        // アダプターに追加
        mAdapter.add(info);
      } while (cursor.moveToNext());
    }
    cursor.close();
    ListView listView = (ListView)findViewById(R.id.listview);
    listView.setAdapter(mAdapter);
  }

  // IDから電話番号を取得
  private String getPhoneNumber(String id) {
    String phones = "";

    Cursor cursor = mCResolver.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
        null,
        null
      );
    if (cursor.moveToFirst()) {
      do {
        phones += "\n" + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
      } while (cursor.moveToNext());
    }
    cursor.close();
    return phones;
  }

  // IDからメールアドレスを取得
  private String getEmailData(String id) {
    String emails = "";

    Cursor cursor = mCResolver.query(
        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + id,
        null,
        null
      );
    if (cursor.moveToFirst()) {
      do {
        emails += "\n" + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
      } while (cursor.moveToNext());
    }
    cursor.close();
    return emails;
  }
}
  • AndroidManifest.xml
    • "android.permission.READ_CONTACTS"パーミッションを設定する.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.moonlight_aska.android.contactlist"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />
  <uses-permission android:name="android.permission.READ_CONTACTS"/>

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name="com.moonlight_aska.android.contactlist.MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>
  • 動作例
SHARP SHL22 / Android 4.2.2