最近在做手机联系人的功能模块的时候,遇到了很多的坑,在网上搜索的有一些所谓的最全的手机联系人开发的介绍还存在一些bug,所以我把我最近的项目心得和方法写下来,既能帮助大家减少了解android开发手机联系人的门槛,好,废话少说,接下来直奔主题。

一、深入浅出手机联系人的前奏(小米手机的data表跟模拟器的data表不一样)
1、手机联系人主要是对contacts2.db数据库表的操纵,这个数据库中有三个表是比较重要的,分别是data,raw_contacts,mimetyps这三个表。在下面的增删查改模块中,主要是根据表之间的关系来关联的处理的。
1.1、data表
1.2、mimetypes表
1.3、raw_contacts表
1.4、下载contacts2.db表的方法
在eclipse中打开android模拟器,在eclipse导航栏的window->show View->other..->File Explorer.单击eclipse导航栏右上角的DDMS,File Explorer 下的data->data->com.android.providers.contact->databases下就有contacts2.db数据库了。单击然后保存就可以了。
查看SqlLite软件的下载链接
2、深入浅出之手机联系人查询模块
/**
* 通过输入获取电话号码
*/
public void number(String name1,long rawContactId) {
//使用ContentResolver查找联系人数据
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
//遍历查询结果,找到所需号码
while (cursor.moveToNext()) {
//获取联系人ID
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
//获取联系人的名字
String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
if (name1.equals(contactName)) {
//使用ContentResolver查找联系人的电话号码和用户名
Cursor phone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
if (phone.moveToNext()) {
String phoneNumber1 = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));//电话号码
String phoneName1 = phone.getString(phone.getColumnIndex(Phone.DISPLAY_NAME));//姓名
phoneNumber.setText(phoneNumber1);
name.setText(phoneName1);
}
//获取邮箱信息
Cursor emails =getContentResolver().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));
email.setText(emailAddress);
}
//获取IM信息
Cursor cursorQQ =getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,ContactsContract.Data.RAW_CONTACT_ID+"="+rawContactId + " AND " + "mimetype_id=2",null,null);
while(cursorQQ.moveToNext()){
//获取公司信息
String im1 = cursorQQ.getString(cursorQQ.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
qq.setText(im1);
}
//获取公司信息
Cursor cursorCompany =getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,ContactsContract.Data.RAW_CONTACT_ID+"="+rawContactId + " AND " + "mimetype_id = 4",null,null);
while(cursorCompany.moveToNext()){
String company1=cursorCompany.getString(cursorCompany.getColumnIndex("data1"));
String position1=cursorCompany.getString(cursorCompany.getColumnIndex("data4"));
position.setText(position1);
company.setText(company1);
}
}
}
}
3、深入浅出之手机联系人增加模块
//增加联系人
public void addContact(String name, String phoneNumber,String email,String company,String position,String im) {
/* 往 raw_contacts 中添加数据,并获取添加的id号*/
/* 往 raw_contacts 中添加数据,并获取添加的id号*/
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentValues values = new ContentValues();
long rawContactId= ContentUris.parseId(resolver.insert(uri, values));
//插入data表
uri = Uri.parse("content://com.android.contacts/data");
// 向data表插入数据
if (name != "") {
values.put("raw_contact_id", rawContactId);
values.put("mimetype", "vnd.android.cursor.item/name");
values.put("data2", name);
resolver.insert(uri, values);
}
// 向data表插入电话号码
if ( phoneNumber != "") {
values.clear();
values.put("raw_contact_id", rawContactId);
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
values.put("data2", "2");
values.put("data1", phoneNumber);
resolver.insert(uri, values);
}
//向data表中插入邮箱
if (email!= "") {
// 添加Email
values.clear();
values.put("raw_contact_id", rawContactId);
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
values.put(Email.DATA, email);
values.put(Email.TYPE, Email.TYPE_WORK);
resolver.insert(uri, values);
}
//向data表中插入联系人的组织
if(company!=""&&position!=""){
//organization
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Organization.MIMETYPE, Organization.CONTENT_ITEM_TYPE);
values.put(Organization.LABEL, name);
values.put(Organization.TITLE, position);
values.put(Organization.COMPANY, company);
values.put(Organization.TYPE,Organization.TYPE_WORK);
context.getContentResolver().insert(uri, values);
}
//向data表中插入联系人的QQ
if(im!=""){
//im
values.clear();
values.put("raw_contact_id", rawContactId);
values.put("mimetype", "vnd.android.cursor.item/im");
values.put(Im.DATA, im);
values.put(Im.TYPE, Im.TYPE_WORK);
resolver.insert(uri, values);
}
}
4、深入浅出之手机联系人更新模块
// 更新联系人
public void updataContact(long rawContactId,String name,String number,String email,String company,String position,String im) {
Uri uri = Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作
ContentValues values = new ContentValues();
//更新电话号码
values.put("data1", number);
resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"5", rawContactId+""}) ;
//更新联系人姓名
values.clear();
values.put("data1", name);
resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"7", rawContactId+""}) ;
//更新email
values.clear();
values.put("data1", email);
resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"1", rawContactId+""}) ;
//更新im
values.clear();
values.put("data1", im);
resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"2", rawContactId+""}) ;
//更新company
values.clear();
values.put("data1", company);
values.put("data3",name);
values.put("data4",position);
resolver.update(uri, values, "mimetype_id=? and raw_contact_id=?", new String[]{"4", rawContactId+""}) ;
}
5、深入浅出之手机联系人删除模块
// 删除联系人
public void deleteContact(long rawContactId) {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Cursor cursor =
resolver.query(uri,new String[]{RawContacts._ID},"contact_id=?",new String[]{String.valueOf(rawContactId) }, null );
if(cursor.moveToFirst()){
int id = cursor.getInt(0);
resolver.delete(uri, "_id=?",new String[]{id+""});
uri = Uri.parse("content://com.android.contacts/data");
resolver.delete(uri, "raw_contact_id=?",new String[]{id+""});
cursor.close();
}
}
6、大话自制手机联系人软件与系统手机联系人软件的区别
6.1、系统的手机联系人软件在删除单个联系人的时候不是直接删除的,然是通过把某个值设置为0,使得该手机联系人信息不可见,根据网上的大多数实例都是直接把data数据库表中的单个联系人的信息直接delete了。
# android
# 增删改查
# 联系人
# Android获取手机通讯录、sim卡联系人及调用拨号界面方法
# Android 获取手机联系人实例代码详解
# android利用ContentResolver访问者获取手机联系人信息
# Android获取手机联系人信息
# Android获取手机联系人电话号码并返回结果
# Android读取手机通讯录联系人到自己项目
# android如何获取手机联系人的数据库示例代码
# Android编程实现读取手机联系人、拨号、发送短信及长按菜单操作方法实例小结
# Android ContentProvider获取手机联系人实例
# Android ContentProvider实现手机联系人读取和插入
# 深入浅出
# 单击
# 主要是
# 都是
# 就有
# 把我
# 遍历
# 中有
# 所需
# 设置为
# 最全
# 这三个
# 下载链接
# 查询结果
# 少说
# 既能
# 就可以
# 写下来
# 在网上
# 所以我
相关文章:
如何用免费手机建站系统零基础打造专业网站?
如何在IIS中新建站点并配置端口与IP地址?
电商网站制作价格怎么算,网上拍卖流程以及规则?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
建站之星伪静态规则如何设置?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
详解jQuery停止动画——stop()方法的使用
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
如何在万网ECS上快速搭建专属网站?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
建站之星各版本价格是多少?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何零基础在云服务器搭建WordPress站点?
如何在宝塔面板中创建新站点?
外贸公司网站制作哪家好,maersk船公司官网?
如何在云虚拟主机上快速搭建个人网站?
高性价比服务器租赁——企业级配置与24小时运维服务
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
如何通过虚拟机搭建网站?详细步骤解析
制作网站的基本流程,设计网站的软件是什么?
非常酷的网站设计制作软件,酷培ai教育官方网站?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
淘宝制作网站有哪些,淘宝网官网主页?
高防服务器租用首荐平台,企业级优惠套餐快速部署
建站之星logo尺寸如何设置最合适?
已有域名和空间,如何快速搭建网站?
如何生成腾讯云建站专用兑换码?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
建站之星如何取消后台验证码生成?
大连网站设计制作招聘信息,大连投诉网站有哪些?
海南网站制作公司有哪些,海口网是哪家的?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何安全更换建站之星模板并保留数据?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
网站制作员失业,怎样查看自己网站的注册者?
如何快速使用云服务器搭建个人网站?
开源网站制作软件,开源网站什么意思?
网站制作服务平台,有什么网站可以发布本地服务信息?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何选择美橙互联多站合一建站方案?
如何在IIS服务器上快速部署高效网站?
公司门户网站制作流程,华为官网怎么做?
网站制作说明怎么写,简述网页设计的流程并说明原因?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
电商平台网站制作流程,电商网站如何制作?
*请认真填写需求信息,我们会在24小时内与您取得联系。