对联系人进行增删改查

我已经将联系人操作的方法进行了封装,暴露了几个重要的方法,方便以后调用。

1. public void printContactsList() // 获取到的联系人列表(用于测试用)

2. public ArrayList<ContactBean> getContactsList() // 得到手机和SIM卡中的联系人列表(姓名 + 电话号码)

3. public void add(String name, String phoneNumber) // 添加一个新的联系人数据

4. public boolean delete(String name) // 删除单个联系人数据

5. public boolean update(String name, String phoneNumber) // 更新联系人数据

6. public boolean findNameByPhoneNumber(String phoneNumber) // 根据电话号码查询姓名

 

增删改查通讯录:http://blog.csdn.net/xiazdong/article/details/7713419

监听联系人的改变:http://www.eoeandroid.com/thread-234378-1-1.html

 

全部代码:

package com.kale.contatctest;

import java.util.ArrayList;
import java.util.Collection;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts.Data;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

public class ContactsManager {

    private Context mContext = null;

    public ContactsManager(Context context) {
        mContext = context;
    }

    /**
     * @description 打印获取到的联系人列表(用于测试用)
     *
     */
    public void printContactsList() {
        System.out.println("showContactsList----------------->" + getContactsList().size());
        for (int i = 0; i < getContactsList().size(); i++) {
            ContactBean cb = new ContactBean();
            cb = getContactsList().get(i);
            System.out.println(i + 1 + "  " + cb.getContactName() + "  " + cb.getPhoneNumber());
        }
    }

    /**
     * @description 得到手机和SIM卡中的联系人列表(姓名 + 电话号码)
     *
     * @return
     */
    public ArrayList<ContactBean> getContactsList() {
        ArrayList<ContactBean> contactsList = new ArrayList<ContactBean>();
        Collection<ContactBean> collection = getPhoneList();
        contactsList.addAll(collection);

        collection.clear();
        collection = getSIMList();
        contactsList.addAll(collection);

        return contactsList;
    }

    /**
     * 将“手机通讯录”联系人添加到list中
     */
    private ArrayList<ContactBean> getPhoneList() {
        Uri uri = Phone.CONTENT_URI;
        return getContactsList(uri);
    }

    /**
     * 将“手机SIM”联系人添加到list中
     */
    private ArrayList<ContactBean> getSIMList() {
        Uri uri = Uri.parse("content://icc/adn");
        return getContactsList(uri);
    }

    /**
     * @param uri
     * @return 根据URL来得到手机/SIM卡中的联系人列表
     */
    private ArrayList<ContactBean> getContactsList(Uri uri) {
        ArrayList<ContactBean> list = new ArrayList<ContactBean>();
        ContentResolver resolver = mContext.getContentResolver();
        /*
         * 获取库Phone表字段,仅仅获取电话号码联系
         * 它所指向的其实是“content://com.android.contacts/data/phones”。
         * 这个URL对应着contacts表 和 raw_contacts表 以及 data表 所以说我们的数据都是从这三个表中获取的。
         */
        String[] PHONES_PROJECTION = new String[] { Phone.DISPLAY_NAME, Phone.NUMBER, Phone.CONTACT_ID };
        Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null, null);
        if (phoneCursor != null) {
            while (phoneCursor.moveToNext()) {
                // 得到手机号码
                String phoneNumber = phoneCursor.getString(1);
                // 当手机号码为空的或者为空字段 跳过当前循环,即使这个联系人有名字也跳出循环
                if (TextUtils.isEmpty(phoneNumber)) {
                    continue;
                }
                // 如果有电话好么,那么就得到联系人名称
                String contactName = phoneCursor.getString(0);

                ContactBean cb = new ContactBean();
                cb.setContactName(contactName);
                cb.setPhoneNumber(phoneNumber);
                list.add(cb);
            }
            phoneCursor.close(); // 关闭指针
        }
        return list;
    }

    /**
     * 添加一个新的联系人数据
     * 
     * @param name
     * @param phoneNumber
     * @return 是否添加成功
     */
    public void add(String name, String phoneNumber) {
        // 根据号码找数据,如果存在则不添加,因为有号码但无名字是不允许的
        // if (!findNameByPhoneNumber(phoneNumber)) {
        // 插入raw_contacts表,并获取_id属性
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        ContentResolver resolver = mContext.getContentResolver();
        ContentValues values = new ContentValues();
        long contact_id = ContentUris.parseId(resolver.insert(uri, values));
        // 插入data表
        uri = Uri.parse("content://com.android.contacts/data");
        // 添加姓名
        values.put("raw_contact_id", contact_id);
        values.put(Data.MIMETYPE, "vnd.android.cursor.item/name");
        values.put("data2", name);
        // values.put("data1", "Jack");
        resolver.insert(uri, values);
        values.clear();
        // 添加手机号码
        values.put("raw_contact_id", contact_id);
        values.put(Data.MIMETYPE, "vnd.android.cursor.item/phone_v2");
        values.put("data2", "2"); // 2表示手机
        values.put("data1", phoneNumber);
        resolver.insert(uri, values);
        values.clear();

    }

    /**
     * 删除单个联系人数据
     * 
     * @param name
     * @return 是否删除成功
     */
    public boolean delete(String name) {
        try {
            // 根据姓名求id
            Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
            ContentResolver resolver = mContext.getContentResolver();
            Cursor cursor = resolver.query(uri, new String[] { Data._ID }, "display_name = ?", new String[] { name }, null);
            if (cursor.moveToFirst()) {
                int id = cursor.getInt(0);
                // 根据id删除data中的相应数据
                resolver.delete(uri, "display_name = ?", new String[] { name });
                uri = Uri.parse("content://com.android.contacts/data");
                resolver.delete(uri, "raw_contact_id = ?", new String[] { id + "" });
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Toast.makeText(mContext, "删除失败", Toast.LENGTH_SHORT).show();
        return false;
    }

    /*
     * // 删除全部联系人,十分耗时间。有错误 public boolean deleteAllContact() { ContentResolver
     * resolver = mContext .getContentResolver(); Cursor contactsCur =
     * resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null,
     * null); while(contactsCur.moveToNext()){ //获取ID String rawId =
     * contactsCur.
     * getString(contactsCur.getColumnIndex(ContactsContract.Contacts._ID));
     * //删除 String where = ContactsContract.Data._ID + " =?"; String[]
     * whereparams = new String[]{rawId};
     * resolver.delete(ContactsContract.RawContacts.CONTENT_URI, where,
     * whereparams); } if(contactsCur.moveToNext() == false){ return true; }
     * return false; }
     */
    /*
     * //删除全部数据 public boolean deleteAll(){ getContentResolver().delete(
     * ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), null,
     * null); try { ContentResolver resolver = mContext .getContentResolver();
     * Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
     * resolver.delete(uri, "display_name= true", new String[]{"true"}); uri =
     * Uri.parse("content://com.android.contacts/data"); resolver.delete(uri,
     * "raw_contact_id= true", new String[]{"true"});
     * 
     * } catch (Exception e) { Toast.makeText(mContext, "删除失败",
     * Toast.LENGTH_SHORT).show(); e.printStackTrace(); } return false; }
     */

    /**
     * @description 更新联系人数据
     * 
     * @param name
     * @param phoneNumber
     * @return 是否更新成功
     */
    public boolean update(String name, String phoneNumber) {
        try {
            // 根据姓名求id,再根据id删除
            Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
            ContentResolver resolver = mContext.getContentResolver();
            Cursor cursor = resolver.query(uri, new String[] { Data._ID }, "display_name = ?", new String[] { name }, null);
            if (cursor.moveToFirst()) {
                int id = cursor.getInt(0);
                Uri mUri = Uri.parse("content://com.android.contacts/data");// 对data表的所有数据操作
                ContentResolver mResolver = mContext.getContentResolver();
                ContentValues values = new ContentValues();
                values.put("data1", phoneNumber);
                mResolver.update(mUri, values, "mimetype=? and raw_contact_id=?", 
                        new String[] { "vnd.android.cursor.item/phone_v2", id + "" });
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        Toast.makeText(mContext, "修改失败", Toast.LENGTH_SHORT).show();
        return false;
    }

    /**
     * @description 根据电话号码查询姓名
     *
     * @param phoneNumber
     * @return 查询是否成功
     */
    public boolean findNameByPhoneNumber(String phoneNumber) {
        // URI = content://com.android.contacts/data/phones/filter/#
        Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + phoneNumber);
        ContentResolver resolver = mContext.getContentResolver();
        // 从raw_contact表中返回display_name
        Cursor cursor = resolver.query(uri, new String[] { Data.DATA4 }, null, null, null); 
        if (cursor.moveToFirst()) {
            Log.d("ContactsManager", "找到这个号码");
            return true;
        } else {
            Log.e("ContactsManager", "没找到这个号码");
            return false;
        }
    }

}

 

posted @ 2015-01-17 18:50  developer_Kale  阅读(939)  评论(0编辑  收藏  举报
网站流量统计工具