最近在做手机联系人的功能模块的时候,遇到了很多的坑,在网上搜索的有一些所谓的最全的手机联系人开发的介绍还存在一些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了。
以上的代码仅供参考,如需完整的代码,若点赞10个以上我会考虑在github上开源。