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

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

先送上实例运行效果图:

管理Android通信录_第1张图片

管理Android通信录_第2张图片

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

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;@Overrideprotected 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() {@Overridepublic 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取出联系人姓名及IDwhile (cursor.moveToNext()) {//获取联系人姓名String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));//获取联系IDString 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列表数组用于存放联系人的电话号码和EmailArrayList<String>detail=new ArrayList<String>();//遍历查询结果,获取该联系人的多个电话号码while (phones.moveToNext()) {String phonenumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));detail.add("电话号码:"+phonenumber);}phones.close();//关闭phones游标回收资源//查询联系人EmailCursor 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() {//定义一个显示联系人信息的TextViewTextView 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;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn true;}@Overridepublic boolean hasStableIds() {// TODO Auto-generated method stubreturn true;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {// TODO Auto-generated method stubTextView textView=geTextView();textView.setText(getGroup(groupPosition).toString());return textView;}@Overridepublic long getGroupId(int groupPosition) {// TODO Auto-generated method stubreturn groupPosition;}@Overridepublic int getGroupCount() {// TODO Auto-generated method stubreturn username.size();}@Overridepublic Object getGroup(int groupPosition) {// TODO Auto-generated method stubreturn username.get(groupPosition);}@Overridepublic int getChildrenCount(int groupPosition) {// TODO Auto-generated method stubreturn details.get(groupPosition).size();}@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {// TODO Auto-generated method stubTextView textView=geTextView();textView.setText(getChild(groupPosition, childPosition).toString());return textView;}@Overridepublic long getChildId(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn childPosition;}@Overridepublic Object getChild(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn details.get(groupPosition).get(childPosition);}};//为ExpandableListView设置ExpandableListAdapterlist.setAdapter(adapter);//创建对话框显示查询结果new AlertDialog.Builder(ContactProviderDemo.this).setView(view).setPositiveButton("确定", null).show();}});/*******************************************添加联系人***************************************************/btnAdd.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//获取用户输入的联系人信息String name=edtName.getText().toString();String phone=edtPhone.getText().toString();String email=edtEmail.getText().toString();//定义一个ContentValuesContentValues values=new ContentValues();//向RawContacts.CONTENT_URI插入空值以获得返回的rawContactIdUri uri=resolver.insert(RawContacts.CONTENT_URI, values);//解析出rawContactIdlong rawContactId=ContentUris.parseId(uri);values.clear();/**********添加联系人的姓名*************///设置联系人Idvalues.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*************///设置联系人Idvalues.put(Data.RAW_CONTACT_ID, rawContactId);//设置内容类型values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);//设置联系人Emailvalues.put(Email.DATA,email);//向联系人URi添加联系人姓名resolver.insert(ContactsContract.Data.CONTENT_URI, values);Toast.makeText(ContactProviderDemo.this, "添加联系人成功", Toast.LENGTH_SHORT).show();}});}@Overridepublic 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;}}



更多相关文章

  1. 服务端和Android客户端利用Socket传输JSON数据
  2. 关于android的listview的数据解析和性能优化问题
  3. android存取数据方式:文件、SharedPreferences
  4. 【android】ORMLite框架 的使用方法---给你的数据库操作插上翅膀
  5. android5中数据存储方式详解
  6. Android 系统数据库编程学习日志
  7. 学习笔记(六) 网络编程与数据处理
  8. Android中数据存储的5中方法

随机推荐

  1. Android(安卓)- SQLite
  2. 使用Android(安卓)OpenGL ES 2.0绘图之二
  3. Android面试过程描述
  4. 华为发布全新IDE:DevCro Studio,Facebook正
  5. 微信稳居Android App排行榜4月份国内榜首
  6. 谈Android终端厂商的如何建设 ——
  7. Android Socket与HTTPS校验
  8. Android(安卓)点击通知栏消息打开activit
  9. 一起Talk Android吧(第二百六十五回:Androi
  10. MacAndroid源码下载 Android10详解