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的类型不同。
闽南的花市,一开始是来自漳州百花村,