进行联系人操作的工具类
这个工具类实现的是联系人增删改查的操作,但是并不是十分完美。如果遇到电话有空格,+86什么的可能会出问题,今后会慢慢完善。目前主要功能已经实现,具体原理可以参考这篇博文:http://xys289187120.blog.51cto.com/3361352/656766,http://www.2cto.com/kf/201402/280583.html
首先建立一个模型类:
package com.kale.cprovider; public class ContactBean { private String contactName; private String phoneNumber; public void setContactName(String contactName){ this.contactName = contactName; } public String getContactName(){ return contactName; } public void setPhoneNumber(String phoneNumber){ this.phoneNumber = phoneNumber; } public String getPhoneNumber(){ return phoneNumber; } }
下面是工具类:ContactsManager
package com.kale.cprovider; import java.util.ArrayList; 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; public class ContactsManager { private Context mContext = null; /**获取库Phone表字段,仅仅获取电话号码联系人等 *它所指向的其实是“content:// com.android.contacts/data/phones”。 * 这个url 对应着contacts表 和 raw_contacts表 以及 data表 所以说我们的数据都是从这三个表中获取的。 */ private static final String[] PHONES_PROJECTION = new String[] { Phone.DISPLAY_NAME, Phone.NUMBER,Phone.CONTACT_ID }; /**联系人显示名称**/ private final int PHONES_DISPLAY_NAME_INDEX = 0; /**电话号码**/ private final int PHONES_NUMBER_INDEX = 1; /**联系人姓名+号码的list**/ private ArrayList<ContactBean> contactsList = new ArrayList<ContactBean>(); public ContactsManager(Context context) { mContext = context; } /** * @return 得到联系人列表 */ public ArrayList<ContactBean> getContactsList(){ try{ //得到手机中的联系人信息 getPhoneContacts(); //得到sim卡中联系人信息 getSIMContacts(); } catch(Exception e){} return contactsList; } /** * 得到手机通讯录联系人信息 */ private void getPhoneContacts() { ContentResolver resolver = mContext.getContentResolver(); //query查询,得到结果的游标 Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null); if (phoneCursor != null) { while (phoneCursor.moveToNext()) { //得到手机号码 String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX); //当手机号码为空的或者为空字段 跳过当前循环 if (TextUtils.isEmpty(phoneNumber)) continue; //得到联系人名称 String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX); ContactBean cb = new ContactBean(); cb.setContactName(contactName); cb.setPhoneNumber(phoneNumber); contactsList.add(cb); } phoneCursor.close(); } } /** * 得到手机SIM卡联系人人信息 */ private void getSIMContacts() { ContentResolver resolver = mContext.getContentResolver(); Uri uri = Uri.parse("content://icc/adn"); Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null,null); if (phoneCursor != null) { while (phoneCursor.moveToNext()) { // 得到手机号码 String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX); // 当手机号码为空的或者为空字段 跳过当前循环 if (TextUtils.isEmpty(phoneNumber)) continue; // 得到联系人名称 String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX); ContactBean cb = new ContactBean(); cb.setContactName(contactName); cb.setPhoneNumber(phoneNumber); contactsList.add(cb); } phoneCursor.close(); } } /** * @param name * @param phoneNumber * @return 添加一个联系人数据,返回true表示添加成功 */ public boolean add(String name,String phoneNumber){ //根据号码找数据,如果存在则不添加 if(getNameByPhoneNumber(phoneNumber) == null){ //插入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); 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(); return true; } else{ return false; } } // /** * @param name * 删除单个数据,会直接删除是这个名字的人的所有信息 * @return 真为删除成功 */ public boolean delete(String name){ try { //根据姓名求id Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = mContext .getContentResolver(); //查询到name=“name”的集合 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(); } return false; } /** * 修改联系人数据 * @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(); } return false; } /** * 根据电话号码查询姓名 * @param phoneNumber * @return 返回这个电话的主人名,如果没有则返回null */ public String getNameByPhoneNumber(String phoneNumber){ String name = null; //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[]{"display_name"}, null, null, null); if(cursor.moveToFirst()){ name = cursor.getString(0); } cursor.close(); return name; } }