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; } }