安卓获得通讯录联系人

1.首先是联系人实体类:

/** 用于描述一个联系人 */
public class Contact  {
	private int id;
	private String name;
	private String email;
	private String address;
	private int photoId;
	private Bitmap photo;
	private String phone;
	
	public Contact() {
		// TODO Auto-generated constructor stub
	}
//..get()set()

2.和联系人相关的


主要是查询下图中画图表,分别是:contracts,data,mimetype和rawcontacts


简单的几下就是raw_contract_id是和联系人对应的 ,是raw contracts 的主键,是contract,和data表的外键。

mimetype是一张映射表,告诉了数据存放的意义,如图:


data表中后面有15个字段,在android.provider.ContactsContract的内部类Data里面有解释各个字段的含义:

例如:

By convention, binary data is stored in DATA15.  The thumbnail of the photo is stored in this column.</td>

所以:

流程就是先插Contacts,查出联系人的raw contracts id 和 photo id 字段,然后通过raw contracts id 查询raw contracts表 得到其他信息封装起来

在业务封装类的方法里面

//联系人
		List<Contact> contacts=new ArrayList<Contact>();
		//先查询Contacts表
		ContentResolver r=context.getContentResolver();
		//Uri uri=Uri.parse("content://com.android.providers.contact/contacts");
		Uri uri=Contacts.CONTENT_URI;
		//这里要用这个name_raw_contact_id  而不是那个 Contact._ID
		String[] columns={"name_raw_contact_id", Contacts.PHOTO_ID};
		Cursor c=r.query(uri, columns, null, null, null);
		
		
		String[] dataColumns={
				Data._ID,	<span style="white-space:pre">	</span>//0 
				Data.MIMETYPE, 		//1**
				Data.RAW_CONTACT_ID, 	//2
				Data.DATA1, 		//3
				Data.DATA15};		//4
	
		while(c.moveToNext()){
			Contact contact=new Contact();
			int id=c.getInt(0);
			int photoId=c.getInt(1);
			contact.setId(id);
			contact.setPhotoId(photoId);
			
			Cursor c2=r.query(Data.CONTENT_URI, dataColumns, Data.RAW_CONTACT_ID+"="+id,  null, null);
			while(c2.moveToNext()){
				int dataId=c2.getInt(0);
				String mimetype=c2.getString(1);
				if(mimetype.equals(Email.CONTENT_ITEM_TYPE)){
					String email=c2.getString(3);
					contact.setEmail(email);
				}else if(mimetype.equals(Phone.CONTENT_ITEM_TYPE)){
					String phone=c2.getString(3);
					contact.setPhone(phone);
				}else if(mimetype.equals("vnd.android.cursor.item/postal-address_v2")){
					String address=c2.getString(3);
					contact.setAddress(address);
				}else if(mimetype.equals("vnd.android.cursor.item/name")){
					String name=c2.getString(3);
					contact.setName(name);
				}
			}
			c2.close();
			contacts.add(contact);
		}
		
		//排序按中文拼音首字母
		Collections.sort(contacts, new SortChineseName()); 
		








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值