Android中有时我们需要操作联系人列表,Android系统提供了关于联系人的内容提供者,是其他应用可以操作联系人列表。
Contacts主要涉及三种表:contacts, data, raw_contacts
其中data表存放的是联系人的具体数据
下面是操作Contacts的具体代码:
package com.lk.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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 android.provider.ContactsContract.CommonDataKinds.Phone; public class ContactService { private Context context; public ContactService(Context context) { super(); this.context = context; } /** * 获取所有联系人的姓名、手机号码,邮箱地址 * @return */ public List<Map<String, String>> getAllContacts() { List<Map<String, String>> contacts = new ArrayList<Map<String,String>>(); ContentResolver contentResolver = this.context.getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/contacts"); Cursor contactsIdCursor = contentResolver.query(uri , new String[]{"_id"}, null, null, null); while(contactsIdCursor.moveToNext()) { Map<String, String> contact = new HashMap<String, String>(); int id = contactsIdCursor.getInt(0); uri = Uri.parse("content://com.android.contacts/contacts/" + id + "/data"); Cursor contactsCursor = contentResolver.query(uri, new String[]{"mimetype", "data1", "data2"}, null, null, null); while(contactsCursor.moveToNext()) { String mimeType = contactsCursor.getString(0); String data = contactsCursor.getString(1); if("vnd.android.cursor.item/phone_v2".equals(mimeType)) { contact.put("phone", data); } else if ("vnd.android.cursor.item/name".equals(mimeType)) { contact.put("name", data); } else if ("vnd.android.cursor.item/email_v2".equals(mimeType)) { contact.put("email", data); } } contacts.add(contact); } return contacts; } /** * 根据手机号码获得姓名 * @param phone * @return */ public String getNameByPhone(String phone) { ContentResolver resolver = this.context.getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + phone); Cursor cursor = resolver.query(uri, new String[]{"display_name"}, null, null, null); if(cursor.moveToNext()) { return cursor.getString(0); } return null; } /** * 添加一个联系人,没有事务机制 */ public void insertContactWithoutTransaction(String name, String phone, String email) { ContentResolver resolver = this.context.getContentResolver(); // 向raw_contacts表插入一条空数据 Uri url = Uri.parse("content://com.android.contacts/raw_contacts"); ContentValues values = new ContentValues(); Uri uri = resolver.insert(url, values); long id = ContentUris.parseId(uri); //向data表中插入姓名数据 url = Uri.parse("content://com.android.contacts/data"); values.clear(); values.put("raw_contact_id", id); values.put("mimetype", "vnd.android.cursor.item/name"); values.put("data2", name); resolver.insert(url, values); //向data表中插入手机号 url = Uri.parse("content://com.android.contacts/data"); values.clear(); values.put("raw_contact_id", id); values.put("mimetype", "vnd.android.cursor.item/phone_v2"); values.put("data1", phone); values.put("data2", 2); resolver.insert(url, values); //向data表中插入邮箱地址 url = Uri.parse("content://com.android.contacts/data"); values.clear(); values.put("raw_contact_id", id); values.put("mimetype", "vnd.android.cursor.item/email_v2"); values.put("data1", email); values.put("data2", 2); resolver.insert(url, values); } /** * 添加一个联系人,使用事务机制 * @throws OperationApplicationException * @throws RemoteException */ public void insertContactWithTransaction(String name, String phone, String email) throws RemoteException, OperationApplicationException { ContentResolver resolver = this.context.getContentResolver(); ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); // 向raw_contacts表插入一条空数据 Uri url = Uri.parse("content://com.android.contacts/raw_contacts"); ContentProviderOperation operation = ContentProviderOperation.newInsert(url).build(); operations.add(operation); //向data表中插入姓名数据 url = Uri.parse("content://com.android.contacts/data"); operation = ContentProviderOperation.newInsert(url) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/name") .withValue("data2", name) .build(); operations.add(operation); //向data表中插入手机号 url = Uri.parse("content://com.android.contacts/data"); operation = ContentProviderOperation.newInsert(url) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/phone_v2") .withValue("data1", phone) .withValue("data2", 2) .build(); operations.add(operation); //向data表中插入邮箱地址 url = Uri.parse("content://com.android.contacts/data"); operation = ContentProviderOperation.newInsert(url) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/email_v2") .withValue("data1", email) .withValue("data2", 2) .build(); operations.add(operation); resolver.applyBatch("com.android.contacts", operations); } /** * 获取手机联系人 * @return */ public List<Map<String, String>> getPeopleInPhone2(){ List<Map<String, String>> list = new ArrayList<Map<String, String>>(); Cursor cursor = this.context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{Phone.DISPLAY_NAME, Phone.NUMBER}, null, null, null); while (cursor.moveToNext()) { Map<String, String> map = new HashMap<String, String>(); String strPeopleName = cursor.getString(0); String strPhoneNum = cursor.getString(1); map.put("peopleName", strPeopleName); map.put("phoneNum", strPhoneNum); list.add(map); } return list; } }
因为操作联系人列表涉及到用户隐私,所以要配置权限:
<!-- 读取联系人列表的权限 --> <uses-permission android:name="android.permission.READ_CONTACTS"/> <!-- 向联系人列表写数据的权限 --> <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
浙公网安备 33010602011771号