对联系人进行增删改查
我已经将联系人操作的方法进行了封装,暴露了几个重要的方法,方便以后调用。
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; } } }