增加和读取需要用到读写权限,查找sdk目录下的sources\ContactsProvider,查看清单文件:
<provider android:name="ContactsProvider2"
android:authorities="contacts;com.android.contacts"
android:label="@string/provider_label"
android:multiprocess="false"
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS">
<path-permission
android:pathPrefix="/search_suggest_query"
android:readPermission="android.permission.GLOBAL_SEARCH" />
<path-permission
android:pathPrefix="/search_suggest_shortcut"
android:readPermission="android.permission.GLOBAL_SEARCH" />
<path-permission
android:pathPattern="/contacts/.*/photo"
android:readPermission="android.permission.GLOBAL_SEARCH" />
</provider>
在通讯录联系人部分的描述中找到
android:authorities="contacts;com.android.contacts"
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS">
authorities:代表了找到通讯录联系人的域名,另外两个是需要在项目中添加的权限。
/**
* 获取通讯录中所有联系人的电话号码和姓名
* @throws Throwable
*/
public void readContacts() throws Throwable{
Uri uri = Uri.parse("content://com.android.contacts/contacts");
ContentResolver resolver = getContext().getContentResolver();
//先得到联系人的外键_id cursor
Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);
//对cursor进行迭代,获取id
while(cursor.moveToNext()){
StringBuilder sb = new StringBuilder();
int contactid = cursor.getInt(0);
sb.append("contactid = ").append(contactid);
//根据id获取cursor
Uri datauri = Uri.parse("content://com.android.contacts/contacts/"+contactid+"/data");
Cursor datacursor = resolver.query(datauri, null, null, null, null);
//迭代cursor,获取name , phone number
while(datacursor.moveToNext()){
String data = datacursor.getString(datacursor.getColumnIndex("data1"));
String mimetype = datacursor.getString(datacursor.getColumnIndex("mimetype"));
if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
sb.append(" , phone = ").append(data);
}else if("vnd.android.cursor.item/name".equals(mimetype)){
sb.append(" , name = ").append(data);
}
}
datacursor.close();
Log.i("readContacts", sb.toString());
}
cursor.close();
}
/**
* 通过电话号码获取姓名,例如添加好了一个电话为18888888888的联系人,通过号码查询到该人姓名
*/
public void getNameByNumber() throws Throwable{
String num = "188-888-88888";
//通过电话号码过滤
Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+num);
ContentResolver resolver = getContext().getContentResolver();
//得到id和全名
Cursor cursor = resolver.query(uri, new String[]{"_id","display_name"}, null, null, null);
while(cursor.moveToNext()){
//只在控制台上打印姓名
String name = cursor.getString(1);
Log.i("name", name);
}
cursor.close();
}
/**
* add contact
*/
public void addContact() throws Throwable{
ContentResolver resolver = getContext().getContentResolver();
//需要先在数据库中插入一行,得到一个id号
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentValues value = new ContentValues();
//不能在value中放null
Uri insertUri = resolver.insert(uri, value);
//插入一行后,通过返回的URI解析出来id号,根据id号进行添加
long contactid = ContentUris.parseId(insertUri);
//add name
Uri datauri = Uri.parse("content://com.android.contacts/data");
value.put("raw_contact_id", contactid);
value.put("data1", "阿凡达");
value.put("mimetype", "vnd.android.cursor.item/name");//要放String 型的 mimetype进去,数据库能自动关联
resolver.insert(datauri, value);
//add tel
value.clear();
value.put("raw_contact_id", contactid);
value.put("data1", "0000000000");
value.put("data2", 1);
value.put("mimetype", "vnd.android.cursor.item/phone_v2");
resolver.insert(datauri, value);
//add email
value.clear();
value.put("raw_contact_id", contactid);
value.put("data1", "aaa@sohu.com");
value.put("mimetype", "vnd.android.cursor.item/email_v2");
resolver.insert(datauri, value);
}
/**
* 通过开启事务的方式增加联系人
*/
public void testAddContactByTrans() throws Throwable{
//定义一个操作集合,存放需要进行的操作
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
//添加行的操作
ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri)
.withValue("account_name", null).build();
operations.add(op1);
Uri datauri = Uri.parse("content://com.android.contacts/data");
//由于上一个操作还没有进行,所以没有id号,使用withValueBackReference得到前一个操作的结果,参数0表示第一个操作返回的结果
//增加姓名的操作
ContentProviderOperation op2 = ContentProviderOperation.newInsert(datauri)
.withValueBackReference("raw_contact_id", 0)
.withValue("data2", "a科比布莱恩特")
.withValue("mimetype", "vnd.android.cursor.item/name")
.build();
operations.add(op2);
//增加电话号码的操作
ContentProviderOperation op3 = ContentProviderOperation.newInsert(datauri)
.withValueBackReference("raw_contact_id", 0)
.withValue("data1", "007007007")
.withValue("data2", 2)
.withValue("mimetype", "vnd.android.cursor.item/phone_v2").build();
operations.add(op3);
//a增加邮箱地址的操作
ContentProviderOperation op4 = ContentProviderOperation.newInsert(datauri)
.withValueBackReference("raw_contact_id", 0)
.withValue("data1", "sohu@sohu.com")
.withValue("data2", 2)
.withValue("mimetype", "vnd.android.cursor.item/email_v2").build();
operations.add(op4);
ContentResolver resolver = getContext().getContentResolver();
//把操作集合放入事务中进行操作,同时失败或者同时成功
resolver.applyBatch("com.android.contacts", operations);
}