管理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;@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设置ExpandableListAdapter list.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;}}
管理Android通信录相关推荐
- Android学习笔记---22_访问通信录中的联系人和添加联系人,使用事物添加联系人...
Android学习笔记---22_访问通信录中的联系人和添加联系
- android通讯录加密,Android获取通信录并上传(包含通信录加密)
很久没更新文章了,近期在作通信录上传,把它分享出来,送给须要的朋友.java 写了一个通信录工具类,直接放代码吧,关键位置经过注释来解释.android 这个工具类包含通信录获取,加密,而后上传操做. ...
- android 备份 通信录,如何简单备份手机通讯录?
现在,很多小伙伴更换手机的速度很快,备份手机通讯录就变成经常性的工作了.备份通信录的办法有很多种.今天,小编就给大家介绍几种备份方法~ SIM卡备份 采用SIM卡备份和还原是最原始,也是最通用的备份方 ...
- 换手机 之导入通信录
是这样的,用了很久的手机突然没法接听电话了,于是就去捣鼓了个新的. 一般买来新手机,最重要的就是导入通信录之类的事情.于是问题就来了,古董手机的系统是Android 1.5的,折腾了半天愣是没找到导出 ...
- 微信是如何飞起来的(延伸阅读:性,微信下的机会?一个超级用户的自白:移动社交那点事类kik手机通信录互动应用前景探讨)
与腾讯的发展史一样,微信在骂声中飞快成长--虽然既非原创,又不具备首发优势,但仅仅一年,微信竟远远超越对手们,拥有了5000万用户. 它的风行,既依托于腾讯源源不断的弹药支援,又源自其持续改进的细节拿 ...
- 【C++】通信录管理系统
题目描述 设计出模拟通信录管理系统,实现对用户的通信录进行管理. 功能需求 (1) 设计一个联系人类Person,包含姓名,电话,单位. (2) 设计一个通讯录类AddressBook,按照分类保存联 ...
- 实验课题——最全手机通信录实现版本(【含注释】848行代码)!!!(包括模糊查询、分类查找、模拟拨号、qsort函数实现排序、文件存储、防误触等功能)
目录 简介: 基本要求: 代码的实现: 1.Contact.h 2.test.c 3.Cantact.c 运行效果图: 部分复杂函数流程图 前两周是本人的实验周,抽到的课题是"手机通信录的实 ...
- JS+XML打造QQ个性通信录
JS+XML打造QQ个性通信录 本文大概介绍用JS操纵XML实现具有查询功能的通信录.而且可以把它嵌入到QQ面板. 主要有 Communication.htm,Communication.xml ,C ...
- Android实现录屏直播(二)需求才是硬道理之产品功能调研
请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接:http://blog.csdn.net/zxccxzzxz/article/details/54254244 Android实现录 ...
最新文章
- 用 Python 帮运营妹纸快速搞定 Excel 文档
- 图像的均值和方差python_python-绘制均值和标准差
- IBM一周内拥有10万Lotus Symphony用户
- python中文编码是什么_Python编码有什么解释吗?
- 关于GPU-driver for linux的资料
- 异常信息配置文件已被另一个程序更改_抢先目睹:SpringBoot2.4配置文件加载机制大变化
- 比Redis快5倍的中间件,究竟为什么这么快?
- CentOS7下简单安装python3.7.0步骤
- Mysql基于Linux上的安装
- shell单引号、双引号、反引号、无引号的区别
- 【C语言】冒泡排序法
- 怎么用一套键鼠控制两个电脑
- Codeforces - Array Queries
- JS基础(乾坤未定,你我皆是黑马4-2)
- VM虚拟机Ubuntu系统鼠标闪烁通用解决办法
- Kubernetes初探
- OpenCV ERROE **: 02:07:27.741:GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the ...
- 计算机学报模板百度云,计算机学报论文模板.doc
- 浅谈智能计算机的未来发展,浅谈计算机人工智能科学技术应用及发展
- Field类的概述和使用