博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2-AIV--使用ContentProvider查询联系人
阅读量:6763 次
发布时间:2019-06-26

本文共 5541 字,大约阅读时间需要 18 分钟。

零、前言

[1].顾名思义,内容提供者,目的:实现跨进程间数据共享

[2].基于数据库提供数据
[3].如电话簿,短信,歌曲信息都是以数据库存储存储,都可以通过ContentProvider获取
[4].不太熟悉安卓运行时权限的童鞋可以看一下我封装的权限申请类:
[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.实体类
/** * 作者:张风捷特烈 * 时间: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.查询联系人的封装方法
/**     * 获取联系人:ContactBean字段:name姓名  address地址  email邮箱 phone手机号     *     * @param ctx 上下文     * @return ContactBean集合     */    public static List
getContact(Context ctx) { //创建一个容器放结果 List
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.查询联系人头像:这个比较耗时,要不要酌情处理,所以封装个方法,没有直接写在上面的方法中
/**     * 根据号码获得联系人头像     *     * @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"/>

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

new Thread(new Runnable() {    @Override    public void run() {        List
contact = PhoneUtils_Contact.getContact(MainActivity.this); System.out.println(contact.get(0)); }}).start();

后记、

1.声明:

[1]本文由张风捷特烈原创,转载请注明

[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力

2.连接传送门:

3.联系我

QQ:1981462002

邮箱:
微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
公众号.jpg
你可能感兴趣的文章
手游开发如何选择后端服务
查看>>
开学季你最想要的这10本编程新书
查看>>
node中的http会了吗? 来手写一个属于自己的'cgp-server'静态服务
查看>>
守护客户数据价值:企业级NewSQL HTAP分布式云TBase架构详解
查看>>
Web3与智能合约交互实战
查看>>
双十一你想要的,我们提前给你备好了——七牛云产品0.1元起购
查看>>
视频直播:Windows中各类画面源的截取和合成方法总结
查看>>
SQL老司机,在SQL中计算 array & map & json数据
查看>>
绘制图片
查看>>
前端工程优化:javascript的优化小结
查看>>
Android 动画实战-仿微博雷达功能
查看>>
leetCode 13 Roman to Integer
查看>>
SpringBoot高级篇Redis之Hash数据结构使用姿势
查看>>
javaScript设计模式:Observer(观察者)模式实践(一)
查看>>
介绍两个好玩的和Github相关的Chrome扩展
查看>>
PC浏览器播放HLS协议的视频
查看>>
函数计算性能福利篇(二) —— 业务冷启动优化
查看>>
Python学习之路25-使用一等函数实现设计模式
查看>>
macOS 10 13 Cocoapods 命令错误
查看>>
Swift3中的 Method Swizzling
查看>>