Android 通信录中的联系人操作

标签: android 通信 | 发表时间:2013-02-14 10:31 | 作者:jaycee110905
出处:http://blog.csdn.net
package cn.itcast.contact;

import java.util.ArrayList;

import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts.Data;
import android.test.AndroidTestCase;
import android.util.Log;

public class ContactTest extends AndroidTestCase {
	private static final String TAG = "ContactTest";
	
	public void testGetAllContact() throws Throwable{
		Uri uri =  ContactsContract.Contacts.CONTENT_URI;
		ContentResolver contentResolver = this.getContext().getContentResolver();
		Cursor cursor = contentResolver.query(uri, null, null, null, null);
		while(cursor.moveToNext()){
			StringBuilder sb = new StringBuilder();
			String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));  
			String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
			sb.append("contactId=").append(contactId).append(",name=").append(name);
			
			Cursor phones = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,  
			        null,  
			        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,  
			        null, null);  
			while(phones.moveToNext()){
				String phoneNumber = phones.getString(phones.getColumnIndex(
						ContactsContract.CommonDataKinds.Phone.NUMBER));
				sb.append(",phone=").append(phoneNumber);
			}
			phones.close();
			
			Cursor emails = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,  
				       null,  
				       ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,  
				       null, null);  
			while (emails.moveToNext()) {  
		        String emailAddress = emails.getString(emails.getColumnIndex(
		        		ContactsContract.CommonDataKinds.Email.DATA));
		        sb.append(",emailAddress=").append(emailAddress);
		    } 
			emails.close();
			Log.i(TAG, sb.toString());
		}
		cursor.close();
	}
	
	/**
	 * 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId 
	 * 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见
	 */
	public void testInsert() {
		ContentValues values = new ContentValues();
		//首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId 
		Uri rawContactUri = this.getContext().getContentResolver().insert(RawContacts.CONTENT_URI, values);
		long rawContactId = ContentUris.parseId(rawContactUri);
		//往data表入姓名数据
		values.clear();
		values.put(Data.RAW_CONTACT_ID, rawContactId); 
		values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//内容类型
		values.put(StructuredName.GIVEN_NAME, "李天山");
		this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
		//往data表入电话数据
		values.clear();
		values.put(Data.RAW_CONTACT_ID, rawContactId);
		values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
		values.put(Phone.NUMBER, "13921009789");
		values.put(Phone.TYPE, Phone.TYPE_MOBILE);
		this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
		//往data表入Email数据
		values.clear();
		values.put(Data.RAW_CONTACT_ID, rawContactId);
		values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
		values.put(Email.DATA, "[email protected]");
		values.put(Email.TYPE, Email.TYPE_WORK);
		this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
	}
	//批量添加,处于同一个事务中
	public void testSave() throws Throwable{
		//文档位置:reference\android\provider\ContactsContract.RawContacts.html
		ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
		int rawContactInsertIndex = ops.size();
		ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
				.withValue(RawContacts.ACCOUNT_TYPE, null)
				.withValue(RawContacts.ACCOUNT_NAME, null)
				.build());
		//文档位置:reference\android\provider\ContactsContract.Data.html
		ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
				.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
				.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
				.withValue(StructuredName.GIVEN_NAME, "赵薇")
				.build());
		ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
				 .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
		         .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
		         .withValue(Phone.NUMBER, "13671323809")
		         .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
		         .withValue(Phone.LABEL, "手机号")
		         .build());
		ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
				 .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
		         .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
		         .withValue(Email.DATA, "[email protected]")
		         .withValue(Email.TYPE, Email.TYPE_WORK)
		         .build());
		ContentProviderResult[] results = this.getContext().getContentResolver()
			.applyBatch(ContactsContract.AUTHORITY, ops);
		for(ContentProviderResult result : results){
			Log.i(TAG, result.uri.toString());
		}
	}

}

作者:jaycee110905 发表于2013-2-14 10:31:56 原文链接
阅读:99 评论:0 查看评论

相关 [android 通信] 推荐:

Android之网络通信

- - 博客园_首页
由于一个项目的需要,我研究了一下android的网络通信方式,大体和java平台的很相似. android平台也提供了很多的API供开发者使用,请按示例图:. 首先,介绍一下通过http包工具进行通信,分get和post两种方式,两者的区别是:. 1,post请求发送数据到服务器端,而且数据放在html header中一起发送到服务器url,数据对用户不可见,get请求是把参数值加到url的队列中,这在一定程度上,体现出post的安全性要比get高.

Android Activity与Service通信

- - CSDN博客移动开发推荐文章
一、当Acitivity和Service处于同一个Application和进程时,通过继承Binder类来实现.      当一个Activity绑定到一个Service上时,它负责维护Service实例的引用,允许你对正在运行的Service进行一些方法调用. 比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信.

Android 进程间通信

- - SegmentFault 最新的文章
单例居然失效了,一个地方设置值,另个地方居然取不到,这怎么可能. 排查半天,发现这两就不在一个进程里,才恍然大悟……. 按照操作系统中的描述:进程一般指一个执行单元,在 PC 和移动设备上指一个程序或者一个应用. 我们都知道,系统为 APP 每个进程分配的内存是有限的,如果想获取更多内存分配,可以使用多进程,将一些看不见的服务、比较独立而又相当占用内存的功能运行在另外一个进程当中.

android跨进程通信(IPC):使用AIDL

- - CSDN博客移动开发推荐文章
AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码. 如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数.

android 进程间通信方式

- - 移动开发 - ITeye博客
由于android系统中应用程序之间不能共享内存. 因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些. 在android SDK中提供了4种用于跨进程通讯的方式. 这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service.

Android WebView与Native通信总结

- - 掘金 架构
当前移动端App的开发很多都需要内嵌WebView来方便业务的快速开展,特别是电商App中,业务变化快,活动多. 仅仅依靠native的开发方式难以满足快速的业务发展,于是混合开发模式便出现. 当前比较知名的有 Cordova,. Ionic, 国内的有 Appcan,. APICloud开发平台,这几种都是依赖于WebView的实现.

Android之父抨击苹果Siri:手机只是通信工具

- 品味视界 - cnBeta.COM
有“Android之父”之称Google移动业务高级副总裁安迪・鲁宾(Andy Rubin)在参加Asia D大会时表示,手机应当是一个通信工具,自己并不赞同苹果Siri语音个人助理的理念. 鲁宾表示,手机是用来与真正的同伴通讯的工具,并不是用户的伴侣. 他说:“我认为手机是一种通信工具,而不应当是个人助理.

Android 通信录中的联系人操作

- - CSDN博客移动开发推荐文章
* 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId. * 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见. //首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId.

Android Service与Activity之间通信的几种方式

- - CSDN博客移动开发推荐文章
转载请注明地址 http://blog.csdn.net/xiaanming/article/details/9750689. 在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢.

基于XMPP协议的Android即时通信系统原理分析

- - CSDN博客Web前端推荐文章
设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务器作为即时通讯平台.          系统主要由以下部分组成:一是服务器,负责管理发出的连接或者与其他实体的会话,接收或转发XML(ExtensibleMarkup Language)流元素给授权的客户端、服务器等;二是客户终端.