文档章节

android中添加通过内容提供者添加联系人

ht896632
 ht896632
发布于 2016/03/02 14:07
字数 586
阅读 9
收藏 0
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 ContastsTest extends AndroidTestCase {
	private static final String TAG = "ContastsTest";
	/**
	 * 查询手机联系人信息包括:姓名、电话、邮件
	 */
	public void testContacts() throws Exception {
		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 contactid = cursor.getInt(0);
			StringBuilder sb = new StringBuilder();
			sb.append("contactid=" + contactid);

			uri = Uri.parse("content://com.android.contacts/contacts/"
					+ contactid + "/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 mimetypetype = datacursor.getString(datacursor
						.getColumnIndex("mimetype"));
				// 判断数据类型name:表示是姓名;email_v2:表示是email邮件;phone_v2:表示是电话
				if ("vnd.android.cursor.item/name".equals(mimetypetype)) {
					sb.append("name=" + data);
				} else if ("vnd.android.cursor.item/email_v2"
						.equals(mimetypetype)) {
					sb.append("email=" + data);
				} else if ("vnd.android.cursor.item/phone_v2"
						.equals(mimetypetype)) {
					sb.append("phone=" + data);
				}
			}
			Log.i(TAG, sb.toString());
		}
	}

	/**
	 * 根据手机号码获取联系人的姓名
	 */
	public void testContactsNameByNumber() throws Exception {
		String number = "15021868030";
		Uri uri = Uri
				.parse("content://com.android.contacts/data/phones/filter/"
						+ number);
		ContentResolver resolver = this.getContext().getContentResolver();
		Cursor cursor = resolver.query(uri, new String[] { "display_name" },
				null, null, null);
		if (cursor.moveToNext()) {
			String name = cursor.getString(0);
			Log.i(TAG, name);
		}
		cursor.close();
	}

	/**
	 * 添加联系人
	 */
	public void testAddContacts() throws Exception {
		Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
		ContentResolver resolver = this.getContext().getContentResolver();
		ContentValues values = new ContentValues();
		long contactid = ContentUris.parseId(resolver.insert(uri, values));
		// 添加姓名
		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", "15021868030");
		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");// 2:表示单位email
		values.put("data1", "ht896632@msn.com");
		resolver.insert(uri, values);
	}

	/**
	 * 在同一个事务中完成联系人各项的操作
	 */
	public void testAddContact2() throws Exception {
		Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
		ContentResolver resolver = this.getContext().getContentResolver();
		ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();

		ContentProviderOperation cpo1 = ContentProviderOperation.newInsert(uri)
				.withValue("account_name", null).build();// 存放谷歌的登录账号
		operations.add(cpo1);
		// 添加姓名
		uri = Uri.parse("content://com.android.contacts/data");
		ContentProviderOperation cpo2 = ContentProviderOperation.newInsert(uri)
				.withValueBackReference("raw_contact_id", 0)
				// 使用第一条记录添加完后返回的ID做为这条记录的值
				.withValue("mimetype", "vnd.android.cursor.item/name")
				.withValue("data2", "卡卡").build();
		operations.add(cpo2);

		// 添加电话
		ContentProviderOperation cpo3 = ContentProviderOperation
				.newInsert(uri)
				.withValueBackReference("raw_contact_id", 0)
				// 使用第一条记录添加完后返回的ID做为这条记录的值
				.withValue("mimetype", "vnd.android.cursor.item/phone_v2")
				.withValue("data2", "2").withValue("data1", "15021868030")
				.build();
		operations.add(cpo3);

		// 添加EMAIL
		ContentProviderOperation cpo4 = ContentProviderOperation
				.newInsert(uri)
				.withValueBackReference("raw_contact_id", 0)
				// 使用第一条记录添加完后返回的ID做为这条记录的值
				.withValue("mimetype", "vnd.android.cursor.item/email_v2")
				.withValue("data2", "2").withValue("data1", "ht896632@msn.com")
				.build();
		operations.add(cpo4);

		resolver.applyBatch("com.android.contacts", operations);
	}
}

注:添加联系人需要在项目清单中加入权限:  

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

© 著作权归作者所有

共有 人打赏支持
ht896632
粉丝 36
博文 53
码字总数 31361
作品 0
闵行
高级程序员
Android基础之应用程序组件

Android应用程序由若干个不同类型的组件组合而成,每一个组件具有其特定的安全保护设计方式,它们的安全直接影响到应用程序的安全。Android应用程序组件的主要类型有:活动(Activity),服务...

柳哥
2014/11/28
0
0
Android应用程序基础(Application Fundamentals)之一

正在尝试分析SDK中的示例程序NotePad,发现仍然还欠缺很多知识。今天看到 API Guides 下有一部分应用程序基础 Application Fundamentals,感觉需要进一步学习。于是准备采用之前的策略,边翻...

AllenYao
2013/01/31
0
0
Android系统架构 四大组件

Android 系统架构 是怎么样工作的。 Linux 内核层 Android 系统是基于Linux内核的 ,这一层为安卓设备的各种硬件提供了底层驱动,如显卡驱动,音频驱动,照相机驱动,蓝牙WIFi电源等驱动 系统...

一箭落旄头
10/08
0
0
Android ——TabHost使用

在Android中,通常可以使用切换卡(选项卡)实现切换显示不同页面内容的功能。这一功能可以通过TabHost控件来实现。   下面我们就通过一个简单的实例演示如何使用TabHost控件完成切换卡功能...

的书法上的
2014/08/05
0
0
Android基础 : ContentProvider和getContentResolver

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

墨梅
2014/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

visualVm 中的 visual GC说明

visual GC 不是 visualVM 自带的,需要安装插件。 步聚:菜单栏 (Tools) - > plugins - > Avaiable Plugins 中就选择安装 Spaces: 各个分代的内存使用情况。 特别说明:风格有分灰色部分,...

Canaan_
昨天
1
0
学习设计模式——生成器模式

1. 认识生成器模式 1. 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 2. 组成: Builder:生成器接口,定义创建一个Product对象所需要的各个组件的操作,...

江左煤郎
昨天
0
0
C语言精要(第二章:基本数据类型)

2.1 C语言基本数据类型 在计算机术语中,把⼆进制数中的某⼀位数又称为⼀个⽐特(bit)。⽐特这个单位对于计算机⽽⾔,在度量上是最⼩的单位。除了⽐特之外,还有字节(byte)这个术语。⼀个...

ryanliue
昨天
0
0
实现下拉菜单多选框效果

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><li>工作意愿地:<%-- <c:forEach items="${list}" var="list"><input type="checkbox" value="${list......

lanjian28
昨天
1
0
scala的视图界定

在上一篇帧子的代码中,如果main函数中不是用字符串而是用数字则程序不能正常编译: class Pair[T <: Comparable[T]](val first:T,val second:T) //类型T必须要是Comparable接口的子类(即...

whoisliang
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部