CallLogProvider介绍

系统的通话记录,是通过 ContentProvider 来对外共享的

负责存放呼叫记录的内容提供者源码在 ContactsProvider 项目下:

源码路径:

com/Android/providers/contacts/CallLogProvider.Java

使用到的数据库在:

/data/data/com.android.providers.contacts/databases/contacts2.db 表名:calls

呼叫记录有三种类型:

来电:CallLog.Calls.INCOMING_TYPE (常量值:1)

已拨:CallLog.Calls.OUTGOING_TYPE(常量值:2)

未接:CallLog.Calls.MISSED_TYPE(常量值:3)

查看源码中的声明:

<provider android:name="CallLogProvider"          android:authorities="call_log"          android:syncable="false" android:multiprocess="false"          android:readPermission="android.permission.READ_CONTACTS"          android:writePermission="android.permission.WRITE_CONTACTS">provider>

所以当我们需要读取通话记录时需要声明权限:

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

需要写入通话记录时需要声明权限:

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

通话记录操作

查询所有的记录

    /**     * 查询所有的记录     */    private void queryAll() {        ContentResolver resolver = getContentResolver();        Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, null, null, null, null);        Log.d(TAG, "call log count:" + cursor.getCount());        while (cursor.moveToNext()) {            String callNumber = cursor.getString(cursor.getColumnIndex("number"));            Log.d(TAG, "call log:" + callNumber);        }    }

查询已知号码的记录

ContentResolver resolver = getContentResolver();resolver.query(CallLog.Calls.CONTENT_URI, null, "number=?", new String[]{"15220000000"}, null);

ps: CallLog.Calls.CONTENT_URI : 等价于:Uri.parse(“content://call_log/calls”)

删除已知号码的记录

/**     * 删除某个记录     */    private void deleteCallLog(String callLog) {        ContentResolver resolver = getContentResolver();        int result = resolver.delete(CallLog.Calls.CONTENT_URI, "number=?", new String[] { callLog });        if (result > 0) {            Log.d(TAG, "deleted success:" + callLog);        } else {            Log.d(TAG, "deleted fail:" + callLog);        }    }

查询某一个联系人的所有未接电话记录(按电话号码)

resolver.query(CallLog.Calls.CONTENT_URI, null, "number=? and type=3", new String[]{"15100000000"}, null);

type取值参照上面呼叫记录的三种类型

删除某联系人最近的一次来电

/**     * 删除某联系人最近的一次来电     *      * @param callLog     */    private void deletLastCallLog(String callLog) {        ContentResolver resolver = getContentResolver();        Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, new String[] { "_id" }, "number=? and (type=1 or type=3)", new String[] { callLog },                "_id desc limit 1");        if (cursor.moveToFirst()) {            int id = cursor.getInt(0);            resolver.delete(CallLog.Calls.CONTENT_URI, "_id=?", new String[] { id + "" });        }    }

最后附上示例代码:http://download.csdn.net/detail/osanyecao1234567/9591196

更多相关文章

  1. BiliBili-IJKPlayer播放器源码分析(一)
  2. ubuntu android 源码下载
  3. 【Android okhttp源码解析 四】任务调度核心类dispatcher解析
  4. Windows下用Git下载android源码
  5. Android状态栏适配源码解析。
  6. (一百三十八)学习Android studio 导入Android源码
  7. android Button源码分析
  8. 【Android okhttp源码解析 五】拦截器流程和源码解析
  9. Ubuntu 16.04环境下使用Clion 2019.1.4 gdb调试Android 7.1.2源

随机推荐

  1. Android(安卓)利用ClipDrawable 自定义进
  2. Android按键拦截处理最佳实践范例(以Back
  3. Android跳转到系统Wifi界面的方式
  4. Android中全屏无标题设置
  5. Android自定义相机镂空遮罩
  6. Android中DecimalFormat的用法
  7. 关于android 调用系统图片浏览器并返回图
  8. Android跳转系统通知权限设置
  9. Android通知
  10. 单例模式在Android中的优化应用