Android访问通讯录和添加联系人

Android中通讯录使用ContentProvider实现

Android中通讯录界面是使用一个App


存储内容使用的是另一个App


需要的权限:

<uses-permission android:name="android.permission.READ_CONTACTS"/><!-- 读取通讯录权限 -->
<uses-permission android:name="android.permission.WRITE_CONTACTS"/><!-- 写入通讯录权限 -->

还有junit单元测试的权限等配置,这里不写了。

单元测试类:

package com.example.test;

import java.util.ArrayList;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;

public class ContactsTest extends AndroidTestCase {
	private static final String TAG = "ContactsTest";

	/**
	 * 获取联系人
	 * */
	public void testGetContacts(){
		Uri uri = Uri.parse("content://com.android.contacts/contacts");	// 访问所有联系人
		ContentResolver resolver = getContext().getContentResolver();
		Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);
		while(cursor.moveToNext()){
			int contactsId = cursor.getInt(0);
			StringBuilder sb = new StringBuilder("contactsId=");
			sb.append(contactsId);
			uri = Uri.parse("content://com.android.contacts/contacts/" + contactsId + "/data");	//某个联系人下面的所有数据
			Cursor dataCursor = resolver.query(uri, new String[]{"mimetype", "data1", "data2"}, null, null, null);
			while(dataCursor.moveToNext()){
				String data = dataCursor.getString(dataCursor.getColumnIndex("data1"));
				String type = dataCursor.getString(dataCursor.getColumnIndex("mimetype"));
				if("vnd.android.cursor.item/name".equals(type)){	// 如果他的mimetype类型是name
					sb.append(", name=" + data);
				} else if("vnd.android.cursor.item/email_v2".equals(type)){	// 如果他的mimetype类型是email
					sb.append(", email=" + data);
				} else if("vnd.android.cursor.item/phone_v2".equals(type)){	// 如果他的mimetype类型是phone
					sb.append(", phone=" + data);
				} 
			}
			Log.i(TAG, sb.toString());
		}
	}
	
	/**
	 * 根据来电号码获取联系人名字
	 * */
	public void testGetContactsByNumber(){
		String number = "15292328801";
		Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + number);
		ContentResolver resolver = getContext().getContentResolver();
		Cursor cursor = resolver.query(uri, new String[]{"display_name"}, null, null, null);
		if(cursor.moveToFirst()){
			String name = cursor.getString(0);
			Log.i(TAG, name);
		}
	}
	
	/**
	 * 添加联系人
	 * 数据一个表一个表的添加,每次都调用insert方法
	 * */
	public void testAddContacts(){
		/* 往 raw_contacts 中添加数据,并获取添加的id号*/
		Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
		ContentResolver resolver = getContext().getContentResolver();
		ContentValues values = new ContentValues();
		long contactId = ContentUris.parseId(resolver.insert(uri, values));
		
		/* 往 data 中添加数据(要根据前面获取的id号) */
		// 添加姓名
		uri = Uri.parse("content://com.android.contacts/data");
		values.put("raw_contact_id", contactId);
		values.put("mimetype", "vnd.android.cursor.item/name");
		values.put("data2", "周国平");
		resolver.insert(uri, values);
		
		// 添加电话
		values.clear();
		values.put("raw_contact_id", contactId);
		values.put("mimetype", "vnd.android.cursor.item/phone_v2");
		values.put("data2", "2");
		values.put("data1", "15099144117");
		resolver.insert(uri, values);
		
		// 添加Email
		values.clear();
		values.put("raw_contact_id", contactId);
		values.put("mimetype", "vnd.android.cursor.item/email_v2");
		values.put("data2", "2");
		values.put("data1", "zhouguoping@qq.com");
		resolver.insert(uri, values);
	}
	
	/**
	 * 添加联系人
	 * 在同一个事务中完成联系人各项数据的添加
	 * 使用ArrayList<ContentProviderOperation>,把每步操作放在它的对象中执行
	 * */
	public void testAddContacts2(){
		Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
		ContentResolver resolver = getContext().getContentResolver();
		// 第一个参数:内容提供者的主机名
		// 第二个参数:要执行的操作
		ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
		
		// 操作1.添加Google账号,这里值为null,表示不添加
		ContentProviderOperation operation = ContentProviderOperation.newInsert(uri)
				.withValue("account_name", null)// account_name:Google账号
				.build();
		
		// 操作2.添加data表中name字段
		uri = Uri.parse("content://com.android.contacts/data");
		ContentProviderOperation operation2 = ContentProviderOperation.newInsert(uri)
				// 第二个参数int previousResult:表示上一个操作的位于operations的第0个索引,
				// 所以能够将上一个操作返回的raw_contact_id作为该方法的参数
				.withValueBackReference("raw_contact_id", 0)
				.withValue("mimetype", "vnd.android.cursor.item/name")
				.withValue("data2", "周国平")
				.build();
		
		// 操作3.添加data表中phone字段
		uri = Uri.parse("content://com.android.contacts/data");
		ContentProviderOperation operation3 = ContentProviderOperation.newInsert(uri)
				.withValueBackReference("raw_contact_id", 0)
				.withValue("mimetype", "vnd.android.cursor.item/phone_v2")
				.withValue("data2", "2")
				.withValue("data1", "15099144117")
				.build();
		
		// 操作4.添加data表中的Email字段
		uri = Uri.parse("content://com.android.contacts/data");
		ContentProviderOperation operation4 = ContentProviderOperation
				.newInsert(uri).withValueBackReference("raw_contact_id", 0)
				.withValue("mimetype", "vnd.android.cursor.item/email_v2")
				.withValue("data2", "2")
				.withValue("data1", "zhouguoping@qq.com").build();
		
		operations.add(operation);
		operations.add(operation2);
		operations.add(operation3);
		operations.add(operation4);
		
		try {
			resolver.applyBatch("com.android.contacts", operations);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值