利用ContentProvider获取联系人列表

最近学习了Android四大组件之一的ContentProvider,Android系统通过ContentProvider为应用程序之间共享数据提供了统一的接口。

Android已经为常见的一些数据提供了默认的ContentProvider。手机里面的联系人信息是以sqlite数据表的形式存储在系统的数据库中的,所以我们若要取到系统的联系人,就得依托于这个类。我们通过一个uri就可以获得这个数据库的一些操作方法,从而对联系人进行增删改查。


有的系统提供的uri,当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。

public static List<Contact> getAllContact(Context context) {
		List<Contact>list=new ArrayList<Contact>();
		//利用系统的ContactProvider来查询联系人信息
		//数据来自contacts,data表
		ContentResolver cr = context.getContentResolver();
		String[]projection =new String[]{ContactsContract.Contacts._ID,ContactsContract.Contacts.PHOTO_ID};
		Cursor cursor=cr.query(ContactsContract.Contacts.CONTENT_URI, projection, 
				null, null, null);
		//遍历从contacts数据表中的数据集
		while(cursor.moveToNext()){
			Contact contact=new Contact();
			contact.set_id(cursor.getInt(0));
			contact.setPhoto_id(cursor.getInt(1));
			//利用联系人的_id,到Data表中继续查询
			ContentResolver cr2=context.getContentResolver();
			Cursor cursor2=cr2.query(ContactsContract.Data.CONTENT_URI,
					new String[]{Data.MIMETYPE,Data.DATA1},
					Data.RAW_CONTACT_ID+"=?", new String[]{String.valueOf(contact.get_id())},
					null);
			//从data表中取回的,特定id联系人的具体数据
			while(cursor2.moveToNext()){
				String mimeTypeString=cursor2.getString(0);
				if (mimeTypeString.equals("vnd.android.cursor.item/email_v2")) {
					contact.setEmail(cursor2.getString(1));
				}
				if (mimeTypeString.equals("vnd.android.cursor.item/name")) {
					contact.setName(cursor2.getString(1));
				}
				if (mimeTypeString.equals("vnd.android.cursor.item/phone_v2")) {
					contact.setPhone(cursor2.getString(1));
				}
				if (mimeTypeString.equals("vnd.android.cursor.item/postal-address_v2")) {
					contact.setAddress(cursor2.getString(1));
				}
				if (mimeTypeString.equals("vnd.android.cursor.item/photo")) {
					//contact.setPhoto_id(cursor2.getInt(1));
					//int photo=contact.get_id();
					//long i=photo;
					/*InputStream input=ContactsContract.Contacts.openContactPhotoInputStream(cr2,
					ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
					(long)contact.get_id()
									//Long.parseLong(String.valueOf(contact.getPhoto_id()))
									//photo
									));
					contact.setPhotoBitmap(BitmapFactory.decodeStream(input));*/
				}
			}
			cursor2.close();
			if (TextUtils.isEmpty(contact.getName())) {
				contact.setName(contact.getPhone());
			}
			list.add(contact);
		}
		cursor.close();
		return list;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值