Android联系人Contacts详解

1.获取联系人详细信息

(原地址)

在(一)中我们只是获取了联系人的ID和NAME,但是这是远远不够的,怎么样获取其他的值呢?

public void fetchContactInformation() {String id,name,phoneNumber,email;ContentResolver contentResolver = this.getContentResolver();Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,null, null, null, null);while(cursor.moveToNext()) {id=cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));name=cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));//Fetch Phone NumberCursor phoneCursor = contentResolver.query(android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, android.provider.ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+id, null, null);while(phoneCursor.moveToNext()) {phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(android.provider.ContactsContract.CommonDataKinds.Phone.NUMBER));System.out.println("id="+id+" name="+name+" phoneNumber="+phoneNumber);}phoneCursor.close();//Fetch emailCursor emailCursor = contentResolver.query(android.provider.ContactsContract.CommonDataKinds.Email.CONTENT_URI,null, android.provider.ContactsContract.CommonDataKinds.Email.CONTACT_ID+"="+id, null, null);while(emailCursor.moveToNext()) {email = emailCursor.getString(emailCursor.getColumnIndex(android.provider.ContactsContract.CommonDataKinds.Email.DATA));System.out.println("id="+id+" name="+name+" email="+email);}emailCursor.close();}cursor.close();}

结果:

11-06 14:38:32.049: I/System.out(26534): id=4 name=张三 phoneNumber=1-234-5611-06 14:38:32.138: I/System.out(26534): id=5 name=李四 phoneNumber=654-32111-06 14:38:32.138: I/System.out(26534): id=5 name=李四 phoneNumber=987-654-32111-06 14:38:32.188: I/System.out(26534): id=5 name=李四 email=wssiqi@126.com

在这里,我们通过

android.provider.ContactsContract.Contacts.CONTENT_URI 来获取联系人的ID和NAME

android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_URI 获取联系人的电话号码

android.provider.ContactsContract.CommonDataKinds.Email.CONTENT_URI 获取联系人的邮箱地址

关键是ContactsContract下面有很多类,很不容易找到到底哪个类包含我们需要的内容。怎样通过比较简单的方法获取所有信息呢?

为了更好的解决这个问题,我们需要先分析联系人的信息是怎样存储在Android上的。

2.Android 联系人存储方式

Android是将联系人信息存储在Sqlite数据库中的,如果想知道Sqlite的详细信息,请百度或者Google。

如何查看Sqlite中Contacts数据库,请参考,我也是从这里了解的。

2.1 联系人 表Contacts

上面这张图就是表contacts的内容,可以从中看出这张表的信息,常用的有_id,display_name

contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,null, null, null, null);

编译后的内容是这样的:

agg_presence status_updates contacts_status_updates ON (status_update_id=contacts_status_updates.status_update_data_id)

省略掉我们不关心的内容,就成了这个:

view_contacts_restricted

view_contacts_restricted是一个视图,你可以把它当作一个表,view_contacts_restricted的主要内容来自于表contacts,,所以我们只能从android.provider.ContactsContract.Contacts.CONTENT_URI获取到ID和DisplayName,要获取到其他信息,就需要从data表获取。

2.2 联系人 表data

这个表就是存储联系人相关信息的表。mimetype表如下:

获取Phone Number的URI:

contentResolver.query(android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, null, null, null);

编译后的内容:

agg_presence status_updates contacts_status_updates presence status_updates )

主要的信息为:

view_data_restricted

获取Email的URI:

contentResolver.query(android.provider.ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, null, null, null);

编译后的内容:

agg_presence status_updates contacts_status_updates presence status_updates )

主要的信息为:

view_data_restricted

可以看出,Phone number和Email的获取都是从同一张表获取的。 唯一的区别是 mimetype的类型不同。

闽南的花市,一开始是来自漳州百花村,

Android联系人Contacts详解

相关文章:

你感兴趣的文章:

标签云: