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;@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(安卓)给TextView 中 部分文字加下划线 并加入超链接(可点
  2. Android(安卓)NavigationView 中 menu item 字体大小设置
  3. EditText的属性
  4. 设置Activity全屏
  5. Android(安卓)显示不满屏的问题解决
  6. 一个不错的启动菜单显示屏动画效果
  7. MaterialDesign系列文章(六)沉浸式状态栏的使用
  8. Android(安卓)应用语言设置的实现
  9. Android(安卓)字体自适应设置

随机推荐

  1. Android(安卓)改变窗口标题栏的布局
  2. 一起学android之微信登录(18)
  3. 提高Android应用程序的速度四大原则
  4. Android4.4的init进程
  5. Android(安卓)ProGuard实例教程
  6. 我的 Android(安卓)开发实战经验总结
  7. Android(安卓)自定义View流程
  8. Android实现二维码扫描功能(一)-ZXing插件
  9. Android热修复技术总结
  10. Android(安卓)Things:用户驱动-输入驱动