通过ContentResolver调用系统URI实现的通讯录示例

原创 2012年03月29日 11:23:53

Android的四大组件之一,ContentProvider,分为两个部分:一是数据组织工具ContentProvider,一是数据调用工具ContentResolver。对于系统已经提供的URI,如通讯录、多媒体、短信等,通常可以不需要再建立额外的数据库,再用ContentProvider进行组织,而是可以直接用ContentResolver调用这些URI,对系统数据库进行增删改查等操作,从而保证整个Android设备中数据的统一。

 

下面这个链接是本人前段时间为了参加MM论坛的一个小比赛所做的通讯录小demo的源码。因为最近工作和生活的一些原因,把比赛的截止日期给耽误了,所以到最后也没做美工。

http://download.csdn.net/detail/sadfishsc/4182452

 

对通讯录URI的分析主要参考的是雨松MOMO的博文:

http://blog.csdn.net/xys289187120/article/details/6730957

 

如下是对通讯录表进行添加和删除的处理类ContactHandler:

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;

public class ContactHandler {
	private Context context;
	
	public ContactHandler(Context context) {
		this.context = context;
	}
	
	public void create(ContactItem item) {
		ContentResolver resolver = context.getContentResolver();
		ContentValues values = new ContentValues();
		
		long rawContactId = ContentUris.parseId(resolver.insert(RawContacts.CONTENT_URI, values));
		
		values.clear();
		values.put(Data.RAW_CONTACT_ID, rawContactId);
		values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
		values.put(StructuredName.DISPLAY_NAME, item.getValue(ContactItem.TYPE_NAME));
		resolver.insert(Data.CONTENT_URI, values);
		
		values.clear();
		values.put(Data.RAW_CONTACT_ID, rawContactId);
		values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
		values.put(Phone.NUMBER, item.getValue(ContactItem.TYPE_PHONE));
		values.put(Phone.TYPE, Phone.TYPE_MOBILE);
		resolver.insert(Data.CONTENT_URI, values);
	}
	
	public void delete(ContactItem item) {
		ContentResolver resolver = context.getContentResolver();
		
		String[] args = {item.getValue(ContactItem.TYPE_CONTACT_ID)};
		
		resolver.delete(RawContacts.CONTENT_URI, Data.CONTACT_ID + "=?", args);
		resolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=?", args);
	}
}

如下是一次性获取通讯录列表信息的类ContractGenerator:

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.Photo;

public class ContactGenerator {
	private Context context;
	
	private static final String[] PROJECTECTION = {
		Phone.DISPLAY_NAME,
		Phone.NUMBER,
		Photo.PHOTO_ID,
		Phone.CONTACT_ID,
	};
	private static final int DISPLAY_NAME_INDEX = 0;
	private static final int PHONE_NUMBER_INDEX = 1;
	private static final int PHOTO_ID_INDEX = 2;
	private static final int CONTACT_ID_INDEX = 3;
	
	public ContactGenerator(Context context) {
		this.context = context;
	}
	
	public List<ContactItem> generateList() {
		List<ContactItem> list = new ArrayList<ContactItem>();
		
		ContentResolver resolver = context.getContentResolver();
		Cursor cursor = resolver.query(Phone.CONTENT_URI, PROJECTECTION, null, null,  PROJECTECTION[DISPLAY_NAME_INDEX] + " ASC");
		while (cursor.moveToNext()) {
			String name = cursor.getString(DISPLAY_NAME_INDEX);
			String phone = cursor.getString(PHONE_NUMBER_INDEX);
			long photoId = cursor.getLong(PHOTO_ID_INDEX);
			long contactId = cursor.getLong(CONTACT_ID_INDEX);
			
			Bitmap head = null;
			if (photoId > 0) {
				Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
				InputStream input = Contacts.openContactPhotoInputStream(resolver, uri);
				head = BitmapFactory.decodeStream(input);
			}
			
			ContactItem item = new ContactItem(context, name, phone, head);
			item.setContactId(contactId);
			list.add(item);
		}
		
		return list;
	}
}

对系统通讯录数据库进行操作,需要在AndroidManifest.xml文件中添加如下两个用户权限:

<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>

对于ContentResolver的使用,主要是如下几个步骤:

1.      通过Context的getContentResolver()方法获取ContentResolver实例;

2.      调用ContentResolver的insert、delete、update、query方法对数据表进行增删改查操作,对数据表的指定是通过系统URI来完成,这些URI会作为参数传入上述4个方法中。详情参见Android API文档。

 

另外,如下的博文分享了包括通讯录、多媒体、短信在内的系统URI:

http://blog.csdn.net/lyx2007825/article/details/7280043

 

就本文中的示例而言,Java源码文件如下图:


除了前述两个对ContentResolver的操作外,本通讯录的UI控件主要基于二级列表ExpandableListView,所以有继承自BaseExpandableListAdapter的二级列表数据处理适配器类ContactAdapter。另外,ContactItem是数据实体类。其余两个Activity类的界面类。

 

最后需要说明的是,对于系统已经提供了URI的数据资源,没有必要再用ContentProvider对其进行封装管理,因而本示例中并没有用到ContentProvider,只用到ContentResolver。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android开发:getContentResolver的使用

getContentResolver的使用 分两种情况: 一、在有Activity和Service的情况下   getContext().getContentResolver().insert(.....

context.getContentResolver().query()详细用法详解

1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人NAME。 [java] view plain copy public ...

操作Android中联系人,通话记录,短息,的URI-项海涛

记住读取联系人需要配置权限: 读取联系人的URI:/** * 所有联系人的查询语句 * cota...

绝对让你理解Android中的Context

文章转自:阿拉灯神灯CSDN博客 http://blog.csdn.net/nugongahou110/article/details/46972237 这个问题是St...
  • chi1002
  • chi1002
  • 2016年04月26日 10:53
  • 1260

使用ContentProvider在应用程序之间共享文件,openFile()和call()的使用

这个例子的文件是放在assets目录下的,使用openFile()分享时,必须将文件生成到手机或内存卡中。 AndroidManifest.xml源代码 ...

ContentProvider深度探索

如果你选择用SQLite数据库存储应用程序数据,我建议你创建ContentProvider,即使存储的数据仅供内部使用。原因是Android提供了一些工具类以及UI相关的类,它们的工作在Content...

Android之调用ContentProvider中的方法

APP A通过Provider的方式向其他应用如APP B提供数据,如果APP B需要调用APP A中的方法,则Provider必须重写call方法,APP B通过调用call方法会执行APP A中P...

android.content.Context.getContentResolver()' on a null object reference错误

首先贴出错误日志: [ RongExceptionHandler ] uncaughtException                                      ...

Android ContentProvider和getContentResolver

安卓系统中的数据库SqlLite操作和java中mysql的数据库操作很不一样,造成这样的原因是因为在安卓中数据库是属于进程的不存在数据库客户端,也不存在数据库服务器。  关于SqlLite数据库的文...

android 常用URI 值得记住

android系统管理联系人的URI如下: ContactsContract.Contacts.CONTENT_URI 管理联系人的Uri ContactsContract.CommonDat...
  • lo5sea
  • lo5sea
  • 2014年07月30日 23:37
  • 17453
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过ContentResolver调用系统URI实现的通讯录示例
举报原因:
原因补充:

(最多只允许输入30个字)