记住读取联系人需要配置权限:<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

读取联系人的URI:

/**
* 所有联系人的查询语句
* cotacts2联系人数据库中
* 与联系人相关的几张数据表
* contacts
* data
* mimetypes
*/
Cursor contactsCusor = context.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
new String[] { Contacts._ID, Contacts.PHOTO_ID,
Contacts.LOOKUP_KEY }, null, null, null);

Cursor cursor = context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[] { Data.MIMETYPE, Data.DATA1, Data.DATA15 },
Data.RAW_CONTACT_ID + "=" + contacts_id, null, null);
Data.DATA1:这个字段就是所有联系人的信息;

Data.MIMETYPE:这个字段就是根据mimetypes这个表中的ID是对应的;
返回的是一个String类型的数据是,可以跟下面的数据进行匹配。
确定(Data.DATA1)返回的具体是什么:

1)"vnd.android.cursor.item/phone_v2":手机号
2)"vnd.android.cursor.item/email_v2":Email
3)"vnd.android.cursor.item/name":名字
4)"vnd.android.cursor.item/postal-address_v2":地址
5)"vnd.android.cursor.item/organization":公司

Data.DATA15:这个字段就是查询出来的头像;

实现思路:根据上一个表中查出的Contacts._ID去Data表中查询,返回的Data.DATA1就是所有的联系人信息,
根据Data.MIMETYPE的数据去跟mimetypes这张表去进行匹配,来确定具体返回的信息是(名字,电话....)

记住读取通话记录需要配置权限:

<uses-permission android:name="android.permission.READ_CALL_LOG" />

<uses-permission android:name="android.permission.WRITE_CALL_LOG" />


读取通话记录的URI:
/**
* 所有通话记录的查询语句
*/
String [] projection = new String[]{CallLog.Calls._ID, //通话记录的_id
CallLog.Calls.CACHED_NAME, //通话记录的名字;
CallLog.Calls.NUMBER, //电话号码
CallLog.Calls.DATE, //通话的时间
CallLog.Calls.TYPE}; //通话的类型 1 呼入电话 2呼出电话 3未接电话

Cursor cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI,
projection,
null, null, CallLog.Calls.DATE+" desc");


记住读取短信需要配置权限:

<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />

读取短信的URI:

/**
* 所有的短信
*/
public static final String SMS_URI_ALL = "content://sms/";
/**
* 收件箱短信
*/
public static final String SMS_URI_INBOX = "content://sms/inbox";
/**
* 发件箱短信
*/
public static final String SMS_URI_SEND = "content://sms/sent";
/**
* 草稿箱短信
*/
public static final String SMS_URI_DRAFT = "content://sms/draft";


/**
*会话的URI
*/
public static final String THREAD_URI = "content://mms-sms/conversations"
/**
*所有短信的URI
*/
public static final String SMS_URI = "content://sms"



读取会话列表获取最后一条短信息有(根据自己需求):

字段名称:body,该字段是短信内容
字段名称:person,该字段的值是:null(代表会话中最后一条短信的发信人 是我或者陌生人取值null,如果是通讯录中有的人,值就是contacts表中该联系人的id)
字段名称:type,该字段的值是:2 (type 1 收短信 2发出短信)
字段名称:date,该字段的值是:1462352825441
字段名称:_id,该字段的值是:5 (该会话中最后一条短信在sms数据表中的id)
字段名称:read,该字段的值是:1 (1 已读 0 未读)
字段名称:thread_id,该字段的值是:1
字段名称:address,该字段的值是:1 366-136-1366(无论最后一条短信是谁发送的,该字段存储的电话就是该会话中对方的电话)


姓名和头像ID在threads表的contentProvider依然不能提供,需要利用电话号码去phone_lookup表中反向查询。

uri:PhoneLookup.CONTENT_FILTER_URI
头像id:PhoneLookup.PHOTO_ID
姓名:PhoneLookup.DISPLAY_NAME

读取一条会话的所有短信息:

String [] projection = new String[] { "_id",
"body", "date", "type" };
ContentResolver resolver = context.getContentResolver();

Cursor cursor = resolver.query(uri, projection, "thread_id = "+thread_id, null, "date asc");


字段名称:body,:该字段是短信内容
字段名称:type, 该字段是短信类型(type 1 收短信 2发出短信)
字段名称:date,:该字段是短信时间戳
字段名称:_id,:该字段是短信表中的ID
字段名称:thread_id,:该字段是会话的ID

====================================================================================================================================

利用电话号码反查头像ID:

calls表中的photo_id列数据存在一个小问题,当对方拨打电话进来时,如果没有接听,则对方的头像ID值是
不会记录在calls表中的。此时CalllogFragment中显示该条通话记录的时候就不会有头像出现。所以,需要利用
电话号码去其它表中查询该用户的头像ID。

利用电话号码查询头像ID最简单的方式就是利用phone_lookup表的

ContentProvider来进行查询。查询时需要注意的是,

该ContentProvider支持的Uri格式为:
Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, 电话号码);

完整的利用电话号码查询头像id的代码实例为:
protected static int getPhotoIdByNumber(Context context,String number) {
int photoId = 0;
//利用phone_lookup数据表所对应的ContentProvider进行查询
ContentResolver cr = context.getContentResolver();
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, number);
Cursor c = cr.query(uri , new String[]{PhoneLookup.PHOTO_ID}, null, null, null);
//如果提供的电话号码确实是有头像的
if(c.moveToNext()){
photoId = c.getInt(0);
}
c.close();
return photoId;
}

====================================================================================================================================

更多相关文章

  1. ActiveAndroid--Android轻量级ORM框架
  2. android设备获取当前wifi下的路由器的mac和路由器的名称
  3. 初探 Retrofit (入门)
  4. Android开发5:短信发送器
  5. Android系统之路(初识MTK) ------ 更改设备盘符名称/型号/名称/
  6. 深入理解java中的package关键字
  7. Android(安卓)监听短信(同时监听广播和数据库)
  8. Android来电和短信操作
  9. Android(安卓)项目与依赖module的theme同名冲突

随机推荐

  1. android 手势检测
  2. GMS认证-Android(安卓)VTS测试
  3. Android(安卓)TabHost布局
  4. Android(安卓)软键盘imeOptions(Done)的用
  5. Activity对象的onCreate方法真是Android
  6. 我的android 第8天 - 单元测试
  7. Android之防火墙功能的实现
  8. Android与HTML+JS交互入门
  9. 细谈Android应用架构
  10. Android网络请求心路历程