1192343055798112256 1153952789488054272
内容提供者-获取手机通讯里的联系人
0

内容提供者-获取手机通讯里的联系人

前面我们学习完了内容提供者的相关知识,现在呢,我们都以应用场景为基础去学习怎么通过内容提供者获取数据,实现场景功能。

在上一篇文章中,我们完成了向日历里插入提醒事件。这篇文章,我们将学习如何从联系人数据库中获取联系人数据。

内容提供者-向日历中插入提醒事件

应用场景,联系人加好友:

TIM图片20191108181249.jpg

权限

权限的话同学们去看这篇文章吧。

Android6.0+应用权限获取步骤

把要获取的权限换成:

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

内容提供者的权限在哪里声明的呢?在内容提供者的配置文件里声明的

AndroidManifest.xml

20191108_113413.png

联系人内容提供者源码

https://github.com/TrillGates/ContactsProvider

Uri

同样的套路,我们从前面的知识就知道怎么去找到Uri了。

首先是找到provider类, 或者从配置文件里找到注册的地方。

20191108_105717.png

ContactsProvider2.java

搜索静态代码块:

20191108_111426.png

ContactsContract.java的代码在framework里

ContactsContract.AUTHORITY的值是

  public static final String AUTHORITY = "com.android.contacts";

ContactsContract.java

数据表

我们主要关心的就是这三张表了。

20191108_165015.png

raw_contacts:包含联系人数据摘要的行,针对特定用户帐户和类型。

mimetypes:数据类型描述表

data:数据表,存储号码,QQ,邮箱,昵称,图片。这些类型都在mimetypes里有。

所以我们要拿一个用户的数据,应该是从raw_contacts里拿到id,再到data拿出数据,根据mimetype来判断数据的类型。

但是现在的android系统不这么玩了。也不直接给你读取mimetypes里的数据了。

通过哪个Uri可以获得呢?

content://com.android.contacts/data/phones

比如说我们要拿联系人号码

private void getPhoneNumbers() {
        ContentResolver cr = getContentResolver();
        Uri rowContactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
        Cursor query = cr.query(rowContactsUri,null,null,null,null);
        List<Contact> contacts = new ArrayList<>();
        while(query.moveToNext()) {
            Contact contact = new Contact();
            String id = query.getString(query.getColumnIndex("_id"));
            contact.setId(id);
            contact.setDisplayName(query.getString(query.getColumnIndex("display_name")));
            Log.d(TAG,"id -- > " + id);
            contacts.add(contact);
        }
        query.close();
        Uri phoneNumUri = Uri.parse("content://com.android.contacts/data/phones");
        for(Contact contact : contacts) {
            Cursor phoneCursor = cr.query(phoneNumUri,new String[]{"data1"},"raw_contact_id=?",new String[]{contact.getId()},null);
            if(phoneCursor.moveToNext()) {
                contact.setPhoneNum(phoneCursor.getString(phoneCursor.getColumnIndex("data1")).replace("-",""));
            }
            phoneCursor.close();
        }

        for(Contact contact : contacts) {
            Log.d(TAG,contact.getId() + " -- NAME --- > " + contact.getDisplayName() + " --- PHONE -- > " + contact.getPhoneNum());
        }
    }

以后方法可能会变,但是套路不变,看源码就知道怎么拿了。

package com.sunofbeaches.contactsproviderdemo;

public class Contact {
    //ID
    private String id;
    //手机号
    private String phoneNum;
    //显示名称
    private String displayName;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }
}

运行结果:

D/MainActivity: 1 -- NAME --- > LaDaju --- PHONE -- > 1 8888888888

附录

官方文档地址:

contacts-provider联系人内容提供者

如果你喜欢作者的文章,欢迎打赏鼓励
评论
发表评论
  • {{item.publishtime|formatDate}}  回复
    {{item.userid}}
    •  回复
      {{item.publishtime|formatDate}}   回复
欢迎关注作者微信公众号
{{subscriptionQrc.subname}}
推荐文章