Android_ContentProvider_访问通讯录

标签: android contentprovider 访问 | 发表时间:2013-11-10 02:16 | 作者:strawberry2013
出处:http://blog.csdn.net

1.简介

联系人提供者是一个很强很灵活的应用组件,用来管理联系人信息,可以方便的操作和查询联系人信息!

主要的3张表格,contact,raw contact,data,但是我们操作主要为raw contact,data两张表


raw contact table


data  table


2.插入联系人

/**
 * 使用批处理,插入联系人信息
 * 插入姓名,email,家庭电话,工作电话,手机号码信息
 * @param view
 */
public void insert() {
	String name = etName.getText().toString().trim();
	String email = etEmail.getText().toString().trim();
	String numHome = etNumHome.getText().toString().trim();
	String numWork = etNumWork.getText().toString().trim();
	String numMobile = etNumMobile.getText().toString().trim();

	ArrayList<ContentProviderOperation> list = new ArrayList<ContentProviderOperation>();
	ContentProviderOperation.Builder builder = null;

	// 插入原始数据
	builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
			.withValue(RawContacts.ACCOUNT_NAME, "")
			.withValue(RawContacts.ACCOUNT_TYPE, "")
			.withValue(RawContacts.DELETED, 0);
	list.add(builder.build());

	// 插入用户名
	builder = ContentProviderOperation.newInsert(Data.CONTENT_URI)
			.withValue(StructuredName.DISPLAY_NAME, name)
			.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
			.withValueBackReference(Data.RAW_CONTACT_ID, 0);
	list.add(builder.build());

	// 插入email
	builder = ContentProviderOperation.newInsert(Data.CONTENT_URI)
			.withValue(Email.ADDRESS, email)
			.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
			.withValueBackReference(Data.RAW_CONTACT_ID, 0);
	list.add(builder.build());

	// 插入 家庭电话号码
	builder = ContentProviderOperation.newInsert(Data.CONTENT_URI)
			.withValue(Phone.NUMBER, numHome)
			.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
			.withValue(Phone.TYPE, Phone.TYPE_HOME)
			.withValueBackReference(Data.RAW_CONTACT_ID, 0);
	list.add(builder.build());

	// 插入工作电话号码
	builder = ContentProviderOperation.newInsert(Data.CONTENT_URI)
			.withValue(Phone.NUMBER, numWork)
			.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
			.withValue(Phone.TYPE, Phone.TYPE_WORK)
			.withValueBackReference(Data.RAW_CONTACT_ID, 0);
	list.add(builder.build());

	// 插入手机号码
	builder = ContentProviderOperation.newInsert(Data.CONTENT_URI)
			.withValue(Phone.NUMBER, numMobile)
			.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
			.withValue(Phone.TYPE, Phone.TYPE_MOBILE)
			.withValueBackReference(Data.RAW_CONTACT_ID, 0);
	list.add(builder.build());

	try {
		resolver.applyBatch(ContactsContract.AUTHORITY, list);
		showOk();
		System.out.println("插入成功");
	} catch (Exception e) {
		e.printStackTrace();
		System.out.println("插入失败!");
	}
}

3.访问通讯录

/**
 * 自定义加载线程,访问通讯录联系人信息
 * 
 * @author Administrator
 * 
 */
private class LoadContactThread extends Thread {
	@Override
	public void run() {
		List<ContactsInfo> infos = new ArrayList<ContactsInfo>();
		Cursor cursor = resolver.query(RawContacts.CONTENT_URI,
				new String[] { RawContacts._ID }, 
				RawContacts.DELETED + "=?", 
				new String[] { "0" }, null);

		while (cursor.moveToNext()) {
			ContactsInfo info = new ContactsInfo();
			String id = cursor.getString(0);
			info.setId(id);

			Cursor c = resolver.query(Data.CONTENT_URI, new String[] {
					"data1", "data2", "mimetype" }, Data.RAW_CONTACT_ID
					+ "=?", new String[] { id }, null);

			while (c.moveToNext()) {
				String data = c.getString(0);
				String type = c.getString(1);
				String mimetype = c.getString(2);
				if (StructuredName.CONTENT_ITEM_TYPE.equals(mimetype)) { // 用户名
					info.setName(data);
				} else if (Email.CONTENT_ITEM_TYPE.equals(mimetype)) { // email
					info.setEmail(data);
				} else if (Phone.CONTENT_ITEM_TYPE.equals(mimetype)) { // 电话
					int t = Integer.parseInt(type);
					if (Phone.TYPE_HOME == t) { // 家庭电话
						info.setNumHome(data);
					} else if (Phone.TYPE_WORK == t) { // 工作电话
						info.setNumWork(data);
					} else if (Phone.TYPE_MOBILE == t) {// 手机
						info.setNumMobile(data);
					}
				}
			}
			c.close(); // 关闭游标
			infos.add(info);// 添加进集合
		}
		cursor.close(); // 关闭游标

		Message msg = handler.obtainMessage();
		msg.obj = infos;
		handler.sendMessage(msg);
	}
}
作者:strawberry2013 发表于2013-11-9 18:16:38 原文链接
阅读:4 评论:0 查看评论

相关 [android contentprovider 访问] 推荐:

Android入门:ContentProvider

- - ITeye博客
一、ContentProvider介绍. ContentProvider翻译为“内容提供者”;. 定义:指该应用包含一些方法,供外界访问,其他应用程序可以调用该方法,比如如果应用A创建了一个数据库“test.db”,默认是私有的,即其他应用程序不能对其进行操作,但是如果应用A使用了ContentProvider,则其他应用程序可以访问该数据库;.

Android ContentProvider总结

- - CSDN博客推荐文章
1) ContentProvider为存储和读取数据提供了统一的接口. 2) 使用ContentProvider,应用程序可以实现数据共享. 3) android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等). 1)ContentProvider简介.

android ContentProvider使用详解

- - CSDN博客移动开发推荐文章
由于之前主要做手机游戏相关的开发,所以ContentProvider了解的不多,今天就来学习一下. 首先来了解一下ContentProvider是什么. ContentProvider是Android的四大组件之一,可见它在Android中的作用非同小可. 它主要的作用是:实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限.

存储文件的ContentProvider

- - ITeye博客
       基于SQLite的ContentProvider我们见得多了,但是我们在做Android应用时,有时候程序需要下载网络上的图片,这时候我们希望能够把图片缓存到客户端本地,下次再要显示该图片时就不用再从网络上下载了,直接从本地缓存读取,这就需要用到存储文件的ContentProvider.

Android电子市场在华无法访问系技术问题

- bill - cnBeta.COM
昨天,Google旗下Android.com在中国无法访问,引起业界猜测. 今天Google新闻发言人塔基・米多斯(Taj Meadows)告诉CNET:“我们确认,在软件升级过程中出现了技术问题,现在已经修复了.

景德镇 Android Market 和 Gmail 应用访问受阻

- NOir - 谷安——谷奥Android专题站
这几天在景德镇 Android Market 和 Gmail 应用访问受阻. 景德镇对如此种种内容都非常敏感,防火墙也到了堪称“伟大”的地步. 这让众多的 Android 用户情何以堪…. 据外媒报道 Gmail 是景德镇经常攻击的目标,现在 Gmail 和菜市场已经很长时间不能访问,看起来这个情况还将持续….

[译]Android访问网络,使用HttpURLConnection还是HttpClient?

- - 郭霖的专栏
转载请注明出处: http://blog.csdn.net/guolin_blog/article/details/12452307. 最近在研究Volley框架的源码,发现它在HTTP请求的使用上比较有意思,在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient.

[Android]用WebView访问证书有问题的SSL网页

- - idv2
在WebView里加载SSL网页很正常,也没什么难度. 但如果要加载的SSL页面的证书有问题,比如过期、信息不正确、发行机关不被信任等,WebView就会拒绝加载该网页. PC上的浏览器会弹出证书错误的对话框,提示你是否要无视错误继续浏览. 实际上在WebView里也可以这样做,以实现加载证书有问题的页面.

android如何让webview里的资源访问本地缓存

- - 移动开发 - ITeye博客
继承并实现一个ContentProvider. 注册AndroidManifest.xml. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

Android中的安全与访问权限控制

- - CSDN博客推荐文章
Android是一个多进程系统,在这个系统中,应用程序(或者系统的部分)会在自己的进程中运行. 系统和应用之间的安全性是通过Linux的facilities(工具,功能)在进程级别来强制实现的,比如会给应用程序分配user ID和Group ID. 更细化的安全特性是通过"Permission"机制对特定的进程的特定的操作进行限制,而"per-URI permissions"可以对获取特定数据的access专门权限进行限制.