内容提供者-获取手机通讯里的联系人
拉大锯
发表于
2019-11-08 00:02
2287
内容提供者
联系人
安卓开发
android基础
安卓
内容提供者-获取手机通讯里的联系人
前面我们学习完了内容提供者的相关知识,现在呢,我们都以应用场景为基础去学习怎么通过内容提供者获取数据,实现场景功能。
在上一篇文章中,我们完成了向日历里插入提醒事件。这篇文章,我们将学习如何从联系人数据库中获取联系人数据。
应用场景,联系人加好友:
权限
权限的话同学们去看这篇文章吧。
把要获取的权限换成:
<uses-permission android:name="android.permission.READ_CONTACTS" />
内容提供者的权限在哪里声明的呢?在内容提供者的配置文件里声明的
联系人内容提供者源码
https://github.com/TrillGates/ContactsProvider
Uri
同样的套路,我们从前面的知识就知道怎么去找到Uri了。
首先是找到provider类, 或者从配置文件里找到注册的地方。
搜索静态代码块:
ContactsContract.java的代码在framework里
ContactsContract.AUTHORITY的值是
public static final String AUTHORITY = "com.android.contacts";
数据表
我们主要关心的就是这三张表了。
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
附录
官方文档地址: