2-AIV--使用ContentProvider查询联系人
零、前言
[1].顾名思义,内容提供者,目的:实现跨进程间数据共享
[2].基于数据库提供数据
[3].如电话簿,短信,歌曲信息都是以数据库存储存储,都可以通过ContentProvider获取
[4].不太熟悉安卓运行时权限的童鞋可以看一下我封装的权限申请类:
TI--安卓运行时权限完美封装
[5].如果只是想使用的人,直接把静态方法拷贝即可,想知道原理的,图片和注释认真看一下,也可以自己分析一下联系人的表。
[6].本文只打印一下查询结果:ListView篇将会界面展示数据,Xml篇将会介绍备份到本地
一、代码实现
1.实现分析:
raw_contacts表中查到contact_id,
每个contact_id下,根据contact_id查询data表字段,
然后判断mimetype的值,新建实体类,将数据设置到实体中,
将实体放入实体集合,查完返回集合。
联系人数据库
我们关注的时三张表:
1.raw_contacts 关注一个字段contact_id
2.data表和mimetype表:关注字段:mimetype_id 、raw_contact_id 、data1
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<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.查询联系人头像:这个比较耗时,要不要酌情处理,所以封装个方法,没有直接写在上面的方法中
/** * 根据号码获得联系人头像 * * @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<ContactBean> contact = PhoneUtils_Contact.getContact(MainActivity.this); System.out.println(contact.get(0)); } }).start();
后记、
1.声明:
[1]本文由张风捷特烈原创,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力
2.连接传送门:
更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
简书首发,腾讯云+社区同步更新
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com
3.联系我
QQ:1981462002
邮箱:1981462002@qq.com
微信:zdl1994328
4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Gradle 使用技巧(五) - AAR
1. 什么是AAR 关于aar文件,摘取官方的解释:AAR 文件的文件扩展名为 .aar,Maven 工件类型也应当是 aar。文件本身是一个包含以下强制性条目的 zip 文件: /AndroidManifest.xml /classes.jar /res/ /R.txt 此外,AAR 文件可能包含以下可选条目中的一个或多个: /assets/ /libs/名称.jar /jni/abi 名称/名称.so(其中 abi 名称 是 Android 支持的 ABI 之一) /proguard.txt /lint.jar 2. AAR文件位置 AAP的位置为 【项目名称/模块名称/build/outputs/aar/】 中,如果没有aar文件,可以通过点击 Build > Make Project 的方式重新生成此文件。 需要注意的是:只有library模块才会生成aar文件,application模块是不会生成的。 3. 如何使用AAR文件 创建一个library工程,写一段简单的代码。 TestUtils Build -> Make Project aar文件位置 将aar文...
- 下一篇
1-AIV--使用ContentProvider获取短信
零、前言 [1].顾名思义,内容提供者,目的:实现跨进程间数据共享 [2].基于数据库提供数据 [3].如电话簿,短信,歌曲信息都是以数据库存储存储,都可以通过ContentProvider获取 [4].不太熟悉安卓运行时权限的童鞋可以看一下我封装的权限申请类:TI--安卓运行时权限完美封装 [5].如果只是想使用的人,直接把静态方法拷贝。 [6].本文只打印一下查询结果:ListView篇将会界面展示数据,Xml篇将会介绍备份到本地 一、代码实现 1.实体类 /** * 作者:张风捷特烈 * 时间:2018/4/12:16:46 * 邮箱:1981462002@qq.com * 说明:短信实体类 */ public class SMSBean { /** * 短信发送方 */ public String address; /** * 号码在通讯录中的姓名:无为null */ public String name; /** * 短信时间 */ public String date; /** * 短信内容 */ public String body; /** * 1 接收短信 2 发送短...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Red5直播服务器,属于Java语言的直播服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装