首页 > 代码库 > 管理Android通信录

管理Android通信录

   

      Android提供了Contacts应用程序来管理联系人,而且Android系统还为联系人管理提供了ContentProvider,这就允许其它应用程序以ContentResolver来管理联系人数据。

   关于ContentProvider、ContentResolver和Uri详解大家可以参考http://blog.csdn.net/fengyuzhengfan/article/details/37743963,这里就不在过多的陈述了!

先送上实例运行效果图:


运行效果图

在对联系人进行操作之前,先让我们了解一下通讯录数据库里面主要的几张表:

1)        RawContacts:存放联系人的ID,_id属性为主键,声明为autoincrement,即不需要手动设置,其他属性也不需要手动设置就有默认值;

2)        mimetypes:存放数据的类型,比如"vnd.android.cursor.item/name"表示“姓名”类型的数据,"vnd.android.cursor.item/phone_v2"表示“电话”类型的数据;

字段名

说明

电话

vnd.android.cursor.item/phone_v2

姓名

vnd.android.cursor.item/name

邮件

vnd.android.cursor.item/email_v2

通信地址

vnd.android.cursor.item/postal-address_v2

组织

vnd.android.cursor.item/organization

照片

vnd.android.cursor.item/photo

 

3)        data 存放具体的数据。

字段名

说明

Data._ID

 "_id"

Data.DISPLAY_NAME

“display_name”

Data.DATA1

“data1”

Data.DATA2

“data2”

Data.RAW_CONTACT_ID

“raw_contact_id”

Data.MIMETYPE

“mimetype”

 

4)        raw_contact_id属性用来连接raw_contacts表,每条记录表示一个具体数据;我们主要的数据(email、phone等)都存放在data表;

5)        StructuredName      中主要保存的是联系人姓名,其称呼名和其拼音名。

当我们向通信录数据库中插入联系人的时候,一般是先往RawContacts表插入一行空值以获得返回的rawContactId也就是联系人ID,之后再根据这个ID陆续向Data表中插入联系人的姓名、电话、以及Email等信息。

应用实例:

package com.jph.contactproviderdemo;

import java.util.ArrayList;

import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
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.provider.ContactsContract.RawContacts;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;
/**
 * Describe:</br>
 * 通过ContenPprovider管理的联系人</br>
 * 本实例主要实现了联系人的添加与查询</br>
 * @author JPH
 * Date:2014.07.15
 * */
public class ContactProviderDemo extends Activity {
	ContentResolver resolver;
	Button btnSelect,btnAdd;
	EditText edtName,edtPhone,edtEmail;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btnAdd=(Button)findViewById(R.id.add);
		btnSelect=(Button)findViewById(R.id.search);
		edtEmail=(EditText)findViewById(R.id.email);
		edtName=(EditText)findViewById(R.id.name);
		edtPhone=(EditText)findViewById(R.id.phone);
		//获取ContentResolver对象
		resolver=getContentResolver();
/*******************************************查询联系人***************************************************/		
		btnSelect.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//定义两个ArrayList用于存放联系人的信息
				final ArrayList<String>username=new ArrayList<String>();
				final ArrayList<ArrayList<String>>details=new ArrayList<ArrayList<String>>();
				//查询联系人数据
				Cursor cursor=resolver.query(ContactsContract.Contacts.CONTENT_URI
						, null, null, null, null);
				//遍历cursor取出联系人姓名及ID
				while (cursor.moveToNext()) {
					//获取联系人姓名
					String name=cursor.getString(cursor.getColumnIndex
							(ContactsContract.Contacts.DISPLAY_NAME));			
					//获取联系ID
					String contactId=cursor.getString(cursor.getColumnIndex
							(ContactsContract.Contacts._ID));	
					username.add(name);
					//查询联系人电话号码
					Cursor phones=resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI					
							, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null);
					//定义一个detail列表数组用于存放联系人的电话号码和Email
					ArrayList<String>detail=new ArrayList<String>();
					//遍历查询结果,获取该联系人的多个电话号码
					while (phones.moveToNext()) {
						String phonenumber=phones.getString(phones.getColumnIndex(
								ContactsContract.CommonDataKinds.Phone.NUMBER));
						detail.add("电话号码:"+phonenumber);				
					}
					phones.close();//关闭phones游标回收资源
					//查询联系人Email
					Cursor emails=resolver.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));
						detail.add("Email:"+emailAddress);				
					}
					emails.close();//关闭emails游标回收资源
					details.add(detail);
				}
				cursor.close();
				//加载result.xml布局界面代表的视图
				View view=getLayoutInflater().inflate(R.layout.result, null);
				//获取view中的ExpandableListView组件
				ExpandableListView list=(ExpandableListView) view.findViewById(R.id.list);
				//创建ExpandableListAdapter为list填充数据
				ExpandableListAdapter adapter=new BaseExpandableListAdapter() {
					//定义一个显示联系人信息的TextView
					TextView geTextView(){		
						TextView textView=new TextView(ContactProviderDemo.this);
						AbsListView.LayoutParams lp=new AbsListView.LayoutParams(
								ViewGroup.LayoutParams.MATCH_PARENT,64);
						textView.setLayoutParams(lp);
						textView.setPadding(36, 0, 0, 0);
						textView.setTextSize(20);
						return textView;
					}
					@Override
					public boolean isChildSelectable(int groupPosition, int childPosition) {
						// TODO Auto-generated method stub
						return true;
					}
					
					@Override
					public boolean hasStableIds() {
						// TODO Auto-generated method stub
						return true;
					}
					
					@Override
					public View getGroupView(int groupPosition, boolean isExpanded,
							View convertView, ViewGroup parent) {
						// TODO Auto-generated method stub
						TextView textView=geTextView();
						textView.setText(getGroup(groupPosition).toString());
						return textView;
					}
					
					@Override
					public long getGroupId(int groupPosition) {
						// TODO Auto-generated method stub
						return groupPosition;
					}
					
					@Override
					public int getGroupCount() {
						// TODO Auto-generated method stub
						return username.size();
					}
					
					@Override
					public Object getGroup(int groupPosition) {
						// TODO Auto-generated method stub
						return username.get(groupPosition);
					}
					
					@Override
					public int getChildrenCount(int groupPosition) {
						// TODO Auto-generated method stub
						return details.get(groupPosition).size();
					}
					
					@Override
					public View getChildView(int groupPosition, int childPosition,
							boolean isLastChild, View convertView, ViewGroup parent) {
						// TODO Auto-generated method stub
						TextView textView=geTextView();
						textView.setText(getChild(groupPosition, childPosition).toString());
						return textView;
					}
					
					@Override
					public long getChildId(int groupPosition, int childPosition) {
						// TODO Auto-generated method stub
						return childPosition;
					}
					
					@Override
					public Object getChild(int groupPosition, int childPosition) {
						// TODO Auto-generated method stub
						return details.get(groupPosition).get(childPosition);
					}
				};
				//为ExpandableListView设置ExpandableListAdapter		
				list.setAdapter(adapter);
				//创建对话框显示查询结果
				new AlertDialog.Builder(ContactProviderDemo.this).
				setView(view).setPositiveButton("确定", null).show();
			}
		});	
/*******************************************添加联系人***************************************************/		
		btnAdd.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//获取用户输入的联系人信息
				String name=edtName.getText().toString();
				String phone=edtPhone.getText().toString();
				String email=edtEmail.getText().toString();
				//定义一个ContentValues
				ContentValues values=new ContentValues();
				//向RawContacts.CONTENT_URI插入空值以获得返回的rawContactId
				Uri uri=resolver.insert(RawContacts.CONTENT_URI, values);
				//解析出rawContactId
				long rawContactId=ContentUris.parseId(uri);
				values.clear();
				/**********添加联系人的姓名*************/
				//设置联系人Id
				values.put(Data.RAW_CONTACT_ID, rawContactId);
				//设置内容类型
				values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
				//设置联系人姓名(StructuredName中保存的是联系人姓名,其称呼名和其拼音名)
				values.put(StructuredName.DISPLAY_NAME, name);
				//向联系人URi添加联系人姓名
				resolver.insert(ContactsContract.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, phone);
				//设置联系人电话类型
				values.put(Phone.TYPE, Phone.TYPE_MOBILE);
				//向联系人URi添加电话号码
				resolver.insert(ContactsContract.Data.CONTENT_URI, values);
				values.clear();
				/**********添加联系人Email*************/
				//设置联系人Id
				values.put(Data.RAW_CONTACT_ID, rawContactId);
				//设置内容类型
				values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
				//设置联系人Email
				values.put(Email.DATA,email);
				//向联系人URi添加联系人姓名
				resolver.insert(ContactsContract.Data.CONTENT_URI, values);
				Toast.makeText(ContactProviderDemo.this, "添加联系人成功", Toast.LENGTH_SHORT).show();
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.contact_provider_demo, menu);
		return true;
	}

}