Skip to content

Android.provider.ContactsContract

The contract between the contacts provider and applications. Contains definitions for the supported URIs and columns. These APIs supersede ContactsContract.Contacts.

Example

주소록 정보를 획득할 수 있는 샘플클래스.

ContactInfo.java:

package ---;

import java.io.InputStream;

import android.content.ContentUris;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.ContactsContract.Contacts;

/**
 * 주소록에 존재하는 단일 사용자에 대한 정보.
 * 
 * @author cwlee
 * @since 2013-08-23
 */
public class ContactInfo {

    public long id = 0;
    public String name;
    public String email;
    public String phone;

    /** 대표사진을 획득한다. */
    public Bitmap getPicture(Context c) {
        if (id != 0 && c != null) {
            Uri photouri = ContentUris.withAppendedId(Contacts.CONTENT_URI, id);
            InputStream input = Contacts.openContactPhotoInputStream(c.getContentResolver(), photouri);

            if (input != null) {
                return BitmapFactory.decodeStream(input);
            }
        }
        return null;
    }
}

ContactManager.java:

package ---;

import java.util.ArrayList;
import java.util.HashMap;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;

/**
 * 주소록 관리자.<br>
 * 
 * <h1>Remarks</h1><br>
 * 사용을 위해 android.permission.READ_CONTACTS 권한이 필요하다.
 * 
 * @author cwlee
 * @since 2013-08-23
 */
public class ContactManager {

    /** Projection. */
    private static final String[] kProjectionArray = new String[] {
    /* ID. */
    ContactsContract.Data.CONTACT_ID,
    /* 출력이름. */
    ContactsContract.Data.DISPLAY_NAME,
    /* 사진. */
    ContactsContract.Data.PHOTO_ID,
    /* MIME-TYPE. */
    ContactsContract.Data.MIMETYPE,
    /* TYPE. */
    ContactsContract.Data.DATA2,
    /* phone.number, organization.company. */
    ContactsContract.Data.DATA1, };

    /** 선택조건. */
    private static final String kSelection = String.format("%s='%s' or %s='%s'",
    /* PHONE Number. */
    ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,
    /* E-MAIL. */
    ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);

    /** 정렬조건. */
    private static final String kSortOrder = ContactsContract.Data.DISPLAY_NAME + "," + ContactsContract.Data._ID
            + " COLLATE LOCALIZED ASC";

    /** 생성자를 지원하지 않는다. */
    protected ContactManager() {
        throw new UnsupportedOperationException();
    }

    /** 전체 주소록(연락처)정보를 획득한다. */
    public static ArrayList<ContactInfo> getContactList(Context c) {
        ContentResolver cr = c.getContentResolver();
        Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI, kProjectionArray, kSelection, null, kSortOrder);
        cursor.moveToFirst();

        // ID중복방지를 위한 MAP컨테이너 사용.
        HashMap<Long, ContactInfo> contacts = new HashMap<Long, ContactInfo>();

        if (cursor.isAfterLast() == false) {

            final int kIdColumn = cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID);
            final int kNameColumn = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);
            final int kMimeColumn = cursor.getColumnIndex(ContactsContract.Data.MIMETYPE);
            final int kData2Column = cursor.getColumnIndex(ContactsContract.Data.DATA2);
            final int kData1Column = cursor.getColumnIndex(ContactsContract.Data.DATA1);

            long id = 0;
            String mime = null;
            String type = null;
            String value = null;
            ContactInfo contact = null;

            // 1회의 루프로 1명의 주소록 정보를 전부 획득할 수 없다.
            // 따라서 중복키를 체크하는 로직이 꼭 필요하다. 그래서 HashMap을 사용한다.
            do {
                mime = null;
                type = null;
                value = null;
                contact = null;
                id = cursor.getLong(kIdColumn);

                // 중복키 방지를 위한 컨테이너 확인.
                if (contacts.containsKey(id) == true) {
                    contact = (ContactInfo) contacts.get(id);
                } else {
                    contact = new ContactInfo();
                }

                if (contact.id == 0) {
                    contact.id = id;
                }

                if (contact.name == null) {
                    contact.name = cursor.getString(kNameColumn);
                }

                mime = cursor.getString(kMimeColumn);

                if (contact.phone == null) {
                    if (mime.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) == true) {
                        type = cursor.getString(kData2Column);
                        value = cursor.getString(kData1Column);
                        if (type != null && Integer.parseInt(type) == Phone.TYPE_MOBILE) {
                            contact.phone = value;
                        }
                    }
                }

                if (contact.email == null) {
                    if (mime.equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) == true) {
                        value = cursor.getString(kData1Column);
                        if (value != null) {
                            contact.email = value;
                        }
                    }
                }

                contacts.put(id, contact);
            } while (cursor.moveToNext() == true);
        }

        cursor.close();

        return new ArrayList<ContactInfo>(contacts.values());
    }
}

Favorite site