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

 

 

管理Android通信录的更多相关文章

  1. 非智能手机通信录备份并还原至Android智能手机方法

    随着智能手机早已深入普通用户的生活,2-3线城市的用户也逐渐从使用非智能机换成使用智能机.最近便遇见了这样一个转移通讯录的需求.之前使用的手机型号是BBK K201,通信录中绝大部分保存在了手机中,最 ...

  2. 黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人

    Android系统中联系人的通讯录的contentProvide是一个单独的apk,显示在界面的contact也是一个独立的apk,联系人apk通过contentProvide访问底层的数据库. 现在 ...

  3. Android实现录屏直播(三)MediaProjection + VirtualDisplay + librtmp + MediaCodec实现视频编码并推流到rtmp服务器

    请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接:http://blog.csdn.net/zxccxzzxz/article/details/55230272 Android实现录 ...

  4. 通信录列表+复杂Adapter分析

    概述 最近写论文之余玩起了github,发现有个citypicker挺不错的,高仿了美团城市选择和定位的一些功能 地址链接 效果图如下: 自己手动写了一遍优化了一些内容,学到了一些姿势,下面对其中一些 ...

  5. 今天研究了一下手机通信录管理系统(C语言)

    题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查 ...

  6. (五)backbone - DEMO - 通信录改造之使用requirejs

    DEMO介绍是 DEMO通信录的扩展,使用requirejs模块化整合 大体实现 • model文件 model/contact.js define(function (){ // user cont ...

  7. UNIX环境高级编程——进程管理和通信(总结)

    进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程   动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合  是个文件,可直观看到 程序program ...

  8. Android实现录屏直播(一)ScreenRecorder的简单分析

    http://blog.csdn.net/zxccxzzxz/article/details/54150396 Android实现录屏直播(一)ScreenRecorder的简单分析 Android实 ...

  9. iOS:通信录(完成)(18-01-18更)

    1.读取通信录 1).9.0以前:AddressBook 2).9.0以后:Contacts 2.调用通信录UI(不弄) 1).9.0以前:AddressBookUI 2).9.0以后:Contact ...

随机推荐

  1. cocos2d-x开关按钮类CCControlSwitch

    在test项目中的ControlExtensionText\ CCControlSwitchTest目录下面的CCControlSwitchTest.cpp中,通过这个例子,我们也可以制作出不错的开关 ...

  2. 用JS实现发邮件的功能 完美解决

    怎样用JS实现发邮件的功能? 我想用JS实现把页面文本框中的内容直接通过邮件的方式发送到一个指定的邮箱.fengxq给出的答案是<script language=javascript>if ...

  3. SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)

    弄了很久,想使用domove这个操作,但是都失败了.最后给svnkit的邮箱写了封邮件,他们告诉我这样做就成功了.实际上是使用docopy这个函数实现了move操作.package com.repos ...

  4. hdu4126(最小生成树+dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4126 题意:给出一幅3000个点的图,有10000次操作: 求将某条边的权值变大后的最小生成树,最后输 ...

  5. android File文件的读写操作

    本程序实现两个文本框和两个按钮,其中一个文本框和一个按钮用于读取文件内容.另一个文本框和另一个按钮用于写入. java代码: package com.example.activity; import ...

  6. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第二步---编辑器(1)--触摸加入点

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...

  7. Android_模拟时钟内时针、分针触摸转动

    最近实现了android里的一个机能,在activity里面画了一个模拟的时针,然后触摸上面的时针跟分针可以实现调时间的功能. 其实,说起原来来还是挺简单的,但是我花了将近一周的时间才全部实现,有点惭 ...

  8. sql大小转换函数

    将字段值转换成大写 UPDATE t SET [name]=UPPER([name]) 将字段值转换成小写 UPDATE t SET [name]=LOWER([name])

  9. Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十三)

    今天我们实验libvirt提供的快照功能,快照可以用于系统恢复,防止安装了某些软件或中病毒等情况导致系统损毁的情况. 一.快照类型 1)        磁盘快照 内部的:快照驻留在原来的镜像文件内部 ...

  10. Apache的Mesos和Google的Kubernetes 有什么区别?

    Apache的Mesos和Google的Kubernetes 有什么区别?本文来自StackOverFlow上的一个问题,主要讨论Mesos和Kubernetes的区别,相信我们很多人也有同意的疑问. ...