此文非教程,作常用工具类记录,因此主要是代码---
--前言
公司项目有这么一个需求,获取用户的通话记录,如果存在24小时内的未接来电则发送状态栏通知,通知上除了可以直接回拨还可以及引导用户打开app的指定模块/页面
因此涉及到知识点:
1.获取通话记录,并判断是否未接
2.发送自定义的通知栏信息,并处理响应事件
3.实践发现点击了自定义通知的按钮,通知栏不会自动收起来因此需要手动收起通知栏
----1. 获取通话记录,需要动态权限授权,这里不做额外解释
//获取通话记录肯定是通过ContentResolver查询了,先定义查询语句
private static final Uri callUri = CallLog.Calls.CONTENT_URI;
private static final String[] columns = {
CallLog.Calls.CACHED_NAME// 通话记录的联系人
, CallLog.Calls.NUMBER// 通话记录的电话号码
, CallLog.Calls.DATE// 通话记录的日期
, CallLog.Calls.DURATION// 通话时长
, CallLog.Calls.TYPE// 通话类型
, CallLog.Calls._ID// 通话ID
};
/**
* 读取数据
*
* @return 读取到的数据
*/
private static List<CallLogEntity> getDataList(Context context) {
// 1.获得ContentResolver
ContentResolver resolver = context.getContentResolver();
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
}
// 2.利用ContentResolver的query方法查询通话记录数据库
/**
* @param uri 需要查询的URI,(这个URI是ContentProvider提供的)
* @param projection 需要查询的字段
* @param selection sql语句where之后的语句
* @param selectionArgs ?占位符代表的数据
* @param sortOrder 排序方式
*/
Cursor cursor = resolver.query(callUri, // 查询通话记录的URI
columns
, null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示
);
List<CallLogEntity> list = new ArrayList<>();
if (cursor == null) return list;
// 3.通过Cursor获得数据
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));
String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE));
int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION));
int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE));
int id = cursor.getInt(cursor.getColumnIndex(CallLog.Calls._ID));
if (isMobileNO(number)) {
long day_lead = getTimeDistance(new Date(dateLong), new Date());
if (day_lead < 2) {//只显示48小时以内通话记录,防止通话记录数据过多影响加载速度
CallLogEntity callLog = new CallLogEntity();
callLog.setCallId(id);
callLog.setName(name == null ? "未备注联系人" : name);
callLog.setNumber(number);
callLog.setDate(dateLong);
callLog.setTime(duration);
callLog.setType(type);
list.add(callLog);
} else {
cursor.close();
return list;
}
}
}
cursor.close();
return list;
}
因为要根据时间过滤,所以写了一个计算时间距离的方法,略显复杂,其实简化可以直接用
(System.currentTimeMillis() - callLog.getDate())/DAY
private static long DAY = 1000 * 60 * 60 * 24;
/**
* 获得两个日期间距多少天
*
* @param beginDate
* @param endDate
* @return
*/
public static long getTimeDistance(Date beginDate, Date endDate) {
Calendar fromCalendar = Calendar.getInstance();
fromCalendar.setTime(beginDate);
fromCalendar.set(Calendar.HOUR_OF_DAY, fromCalendar.getMinimum(Calendar.HOUR_OF_DAY));
fromCalendar.set(Calendar.MINUTE, fromCalendar.getMinimum(Calendar.MINUTE));
fromCalendar.set(Calendar.SECOND, fromCalendar.getMinimum(Calendar.SECOND));
fromCalendar