零、前言
[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.实体类
/**
* 作者:张风捷特烈
* 时间: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.欢迎关注我的微信公众号,最新精彩文章,及时送达:
公众号.jpg
转载于:https://www.cnblogs.com/toly-top/p/9781935.html
相关资源:JAVA上百实例源码以及开源项目