getContentResolver()内容解析者查询联系人

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了getContentResolver()内容解析者查询联系人相关的知识,希望对你有一定的参考价值。

首先,我们需要知道的两个Uri:

1、Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");//查到data表中raw_contact_id

2、Uri uri1 = Uri.parse("content://com.android.contacts/data");

想取数据库里面的信息,就必须要知道表的结构我们看一下view_data表:

我们只需要关心下面三列数据:

技术分享

从表中我们可以看出,Google将联系人信息放在了一列中,也就是data1列,根据raw_contact_id来区分是否为同一个人的信息,根据mimetype区分联系人信息中的name、phone、email,所以首先我们要获得的是raw_contact_id,但是view_data表中的raw_contact_id是重复的。

下面我们再来看一张表raw_contacts

技术分享

从这张表中,我们可以获得联系人的raw_contact_id,也就可以获得联系人的个数,然后通过raw_contact_id获取每个联系人。

 

表的结构了解了,下面我们来看代码:

 1     public void readContacts(){
 2         String name = null;
 3         String phone= null;
 4         String eMail= null;
 5         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
 6         Uri uri1 = Uri.parse("content://com.android.contacts/data");
 7         Cursor cursor = getContentResolver().query(uri,new String[]{"contact_id"},null,null,null);
 8         while (cursor.moveToNext()){
 9             String contacts_id = cursor.getString(0);
10             //System.out.println("contact_id :"+contacts_id);
11 
12             if (contacts_id!=null){
13                 /**
14                  * projection  第二个参数,要查询的列,为null则是查询所有的列
15                  * selection    第三个参数,根据什么条件查询
16                  * selectionArgs    第四个参数,根据什么查的参数
17                  *
18                  */
19                 Cursor cursor1 = getContentResolver().query(uri1,new String[]{"data1","mimetype"},"raw_contact_id=?",new String[]{contacts_id},null);
20                 while (cursor1.moveToNext()){
21                     String data1 = cursor1.getString(0);
22                     String mimetype = cursor1.getString(1);
23                     //System.out.println("data1:"+data1+"--"+"mimetype:"+mimetype);
24                     if (mimetype.equals("vnd.android.cursor.item/name")){
25                         name = data1;
26                     }else if (mimetype.equals("vnd.android.cursor.item/phone_v2")){
27                         phone = data1;
28                     }else if (mimetype.equals("vnd.android.cursor.item/email_v2")){
29                         eMail = data1;
30                     }
31 
32                 }
33                 System.out.println("name:"+name+"- phone:"+phone+" -email:"+eMail);
34             }
35         }
36     }

记得加权限:

<uses-permission android:name="android.permission.READ_CONTACTS"/>

从代码中,我们可以看的很清楚,先获取raw_contact_id,然后通过他,获取data1和mimetype,然后通过mimetype知道data1中的数据是name、phone或者email。

ps:其实解析data表就是解析view_data

 





以上是关于getContentResolver()内容解析者查询联系人的主要内容,如果未能解决你的问题,请参考以下文章

获取手机联系人的信息

内容提供者ContentProvider和内容解析者ContentResolver

内容提供者ContentProvider和内容解析者ContentResolver

内容提供者ContentProvider和内容解析者ContentResolver

ContentProvider 和ContentResolver内容提供者和内容解析者

ContentProvider 和ContentResolver内容提供者和内容解析者