Android 通讯录


ContactsContract增删改查

package com.zhang.contactdemo;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.provider.ContactsContract;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Mr.Z on 2016/11/18 0018.
 * <p>
 * ContactsContract defines an extensible database of contact-related information.
 * Contact information is stored in a three-tier data model:
 * <p>
 * A row in the ContactsContract.Data table can store any kind of personal data,
 * such as a phone number or email addresses. The set of data kinds that can be
 * stored in this table is open-ended. There is a predefined set of common kinds,
 * but any application can add its own data kinds.
 * <p>
 * <p>
 * A row in the ContactsContract.RawContacts table represents a set of data describing
 * a person and associated with a single account (for example, one of the user's Gmail
 * accounts).
 * <p>
 * <p>
 * A row in the ContactsContract.Contacts table represents an aggregate of one or more
 * RawContacts presumably describing the same person. When data in or associated with
 * the RawContacts table is changed, the affected aggregate contacts are updated as necessary.
 */

public class ContactManager {


    /**
     * @param context
     * @return
     */
    public static List<ContactBean> getContacts(Context context) {
        List<ContactBean> contacts = new ArrayList<>();

        ContentResolver resolver = context.getContentResolver();

        //先查询出ContactsContract.RawContacts
        Cursor cursor = resolver.query(ContactsContract.RawContacts.CONTENT_URI,
                new String[]{ContactsContract.RawContacts._ID},
                null,
                null,
                null);

        ContactBean contact;
        //遍历RawContacts
        while (cursor.moveToNext()) {
            contact = new ContactBean();

            //RawContact的id
            long rawContactId = cursor.getLong(cursor.getColumnIndex(ContactsContract.RawContacts._ID));
            contact.setRawContactId(rawContactId);

            //查询出RawContact中的ContactsContract.Data
            Cursor c = resolver.query(ContactsContract.Data.CONTENT_URI,
                    null,
                    ContactsContract.Data.RAW_CONTACT_ID + "=?",
                    new String[]{String.valueOf(rawContactId)},
                    null);


            while (c.moveToNext()) {
                String data1 = c.getString(c.getColumnIndex(ContactsContract.Data.DATA1));
                String mimeType = c.getString(c.getColumnIndex(ContactsContract.Data.MIMETYPE));

                if (mimeType.equals(ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)) {
                    contact.setName(data1);
                } else if (mimeType.equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
                    contact.setPhone(data1);
                }
            }
            contacts.add(contact);
            c.close();
        }
        cursor.close();
        return contacts;
    }

    /**
     * @param context
     * @param contact
     */
    public static void addContact(Context context, ContactBean contact) {
        ContentResolver resolver = context.getContentResolver();

        ContentValues values = new ContentValues();
        Uri rawContactUri = resolver.insert(ContactsContract.RawContacts.CONTENT_URI, values);
        long rawContactId = ContentUris.parseId(rawContactUri);

        ContentValues valuesData1 = new ContentValues();
        valuesData1.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
        valuesData1.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        valuesData1.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getPhone());
        resolver.insert(ContactsContract.Data.CONTENT_URI, valuesData1);

        ContentValues valuesData2 = new ContentValues();
        valuesData2.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
        valuesData2.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
        valuesData2.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.getName());
        resolver.insert(ContactsContract.Data.CONTENT_URI, valuesData2);
    }

    /**
     * @param context
     * @param contact
     */
    public static void updateContact(Context context, ContactBean contact) {
        ContentResolver resolver = context.getContentResolver();

        ArrayList<ContentProviderOperation> ops = new ArrayList<>();

        ops.add(ContentProviderOperation
                .newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(
                        ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?",
                        new String[]{
                                String.valueOf(contact.getRawContactId()),
                                ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE})
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.getName())
                .build());

        ops.add(ContentProviderOperation
                .newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(
                        ContactsContract.Data.RAW_CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?",
                        new String[]{
                                String.valueOf(contact.getRawContactId()),
                                ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE})
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getPhone()).build());

        try {
            resolver.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException | OperationApplicationException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param context
     * @param contact
     */
    public static void deleteContact(Context context, ContactBean contact) {
        ContentResolver resolver = context.getContentResolver();
        resolver.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + "=?",
                new String[]{String.valueOf(contact.getRawContactId())});
    }
}


通讯录的主要操作就是增删改查,还有一些别的内容可通过链接下载源码。

https://github.com/changchou/ContactDemo

 

posted @ 2016-11-19 17:07  changchou  阅读(263)  评论(0编辑  收藏  举报