前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2-AIV--使用ContentProvider查询联系人

2-AIV--使用ContentProvider查询联系人

作者头像
张风捷特烈
发布2018-09-26 16:27:48
5140
发布2018-09-26 16:27:48
举报
零、前言

1.顾名思义,内容提供者,目的:实现跨进程间数据共享 2.基于数据库提供数据 3.如电话簿,短信,歌曲信息都是以数据库存储存储,都可以通过ContentProvider获取 4.不太熟悉安卓运行时权限的童鞋可以看一下我封装的权限申请类: TI--安卓运行时权限完美封装 5.如果只是想使用的人,直接把静态方法拷贝即可,想知道原理的,图片和注释认真看一下,也可以自己分析一下联系人的表。 6.本文只打印一下查询结果:ListView篇将会界面展示数据,Xml篇将会介绍备份到本地

一、代码实现
1.实现分析:

raw_contacts表中查到contact_id, 每个contact_id下,根据contact_id查询data表字段, 然后判断mimetype的值,新建实体类,将数据设置到实体中, 将实体放入实体集合,查完返回集合。

联系人数据库

联系人.png

我们关注的时三张表:
1.raw_contacts 关注一个字段contact_id

raw_contacts.png

2.data表和mimetype表:关注字段:mimetype_id 、raw_contact_id 、data1

data.png

2.实体类
代码语言:javascript
复制
/**
 * 作者:张风捷特烈
 * 时间:2018/4/14:9:23
 * 邮箱:1981462002@qq.com
 * 说明:联系人实体类
 */
public class ContactBean {
    /**
     * 联系人姓名
     */
    public String name;
    /**
     * 联系人地址
     */
    public String address;
    /**
     * 联系人邮箱
     */
    public String email;
    /**
     * 联系人电话
     */
    public String phone;
    /**
     * 联系人头像
     */
    public Bitmap photo;

    @Override
    public String toString() {
        return "ContactBean{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", email='" + email + '\'' +
                ", phone='" + phone + '\'' +
                ", photo=" + photo +
                '}';
    }
}
1.查询联系人的封装方法
代码语言:javascript
复制
    /**
     * 获取联系人:ContactBean字段:name姓名  address地址  email邮箱 phone手机号
     *
     * @param ctx 上下文
     * @return ContactBean集合
     */
    public static List<ContactBean> getContact(Context ctx) {
        //创建一个容器放结果
        List<ContactBean> contactBeans = new ArrayList<>();
        //[1.]获得ContentResolver对象
        ContentResolver resolver = ctx.getContentResolver();
        //[2.1]得到Uri :访问raw_contacts的url
        Uri raw_contactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
        //[2.2]得到Uri ://访问data的url
        Uri dataUri = Uri.parse("content://com.android.contacts/data");
        //[3]查询表,获得raw_contact表游标结果集
        Cursor raw_contactsCursor = resolver.query(
                raw_contactsUri, new String[]{"contact_id"}, null, null, null);
        //[4]遍历游标,获取数据,储存在bean中
        while (raw_contactsCursor.moveToNext()) {
            //[4.1]查询到contact_id
            String contact_id = raw_contactsCursor.getString(0);
            if (contact_id != null) {
                //[4.2]查询表,获得data表游标结果集
                Cursor dataCursor = resolver.query(dataUri,
                        new String[]{"data1", "mimetype"},//注意不是mimetype_id
                        "raw_contact_id=?",
                        new String[]{contact_id}, null);
                //[4.3]新建实体类
                ContactBean contactBean = new ContactBean();
                while (dataCursor.moveToNext()) {
                    String result = dataCursor.getString(0);
                    //[4.4]根据实体类判断数据,放入实体类中
                    String mimetype = dataCursor.getString(1);
                    if (mimetype != null) {
                        switch (mimetype) {
                            case "vnd.android.cursor.item/phone_v2":
                                contactBean.phone = result;
                                break;
                            case "vnd.android.cursor.item/email_v2":
                                contactBean.email = result;
                                break;
                            case "vnd.android.cursor.item/name":
                                contactBean.name = result;
                                break;
                            case "vnd.android.cursor.item/postal-address_v2":
                                contactBean.address = result;
                                break;
                        }
                    }
                }
                //[5.1]关闭data表Cursor
                dataCursor.close();
                contactBeans.add(contactBean);//加入集合
            }
        }
        //[5.2]关闭raw_contacts表Cursor
        raw_contactsCursor.close();
        return contactBeans;
    }
2.查询联系人头像:这个比较耗时,要不要酌情处理,所以封装个方法,没有直接写在上面的方法中
代码语言:javascript
复制
    /**
     * 根据号码获得联系人头像
     *
     * @param ctx    上下文
     * @param number 号码
     * @return 图片
     */
    public static Bitmap getContactPhoto(Context ctx, String number) {
        Bitmap bmpHead = null;
        ContentResolver resolver = ctx.getContentResolver();//获得ContentResolver对象
        // 获得Uri
        Uri uriNumber2Contacts = Uri.parse("content://com.android.contacts/"
                + "data/phones/filter/" + number);
        // 查询Uri,返回数据集
        Cursor cursorCantacts = resolver.query(uriNumber2Contacts, null, null, null, null);
        // 如果该联系人存在
        if (cursorCantacts.getCount() > 0) {
            // 移动到第一条数据
            cursorCantacts.moveToFirst();
            // 获得该联系人的contact_id
            Long contactID = cursorCantacts.getLong(cursorCantacts.getColumnIndex("contact_id"));
            // 获得contact_id的Uri
            Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactID);
            // 打开头像图片的InputStream
            InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri);
            // 从InputStream获得bitmap
            bmpHead = BitmapFactory.decodeStream(input);
        }
        return bmpHead;
    }
3.使用:权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>

注意:查询数据库是耗时操作,为了不阻塞主线程,最好新建个线程操作

代码语言:javascript
复制
new Thread(new Runnable() {
    @Override
    public void run() {
        List<ContactBean> contact = PhoneUtils_Contact.getContact(MainActivity.this);
        System.out.println(contact.get(0));
    }
}).start();

本文由张风捷特烈原创,转载请注明 更多安卓技术欢迎访问:https://www.jianshu.com/c/004f3fe34c94 张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com 你的喜欢与支持将是我最大的动力

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、前言
  • 一、代码实现
    • 1.实现分析:
      • 联系人数据库
        • 我们关注的时三张表:
          • 1.raw_contacts 关注一个字段contact_id
        • 2.data表和mimetype表:关注字段:mimetype_id 、raw_contact_id 、data1
          • 2.实体类
            • 1.查询联系人的封装方法
              • 2.查询联系人头像:这个比较耗时,要不要酌情处理,所以封装个方法,没有直接写在上面的方法中
                • 3.使用:权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>
                相关产品与服务
                短信
                腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档