手机通话记录是保存在数据库中的,位置:  /data/data/com.android.providers.contacts/databases/calllog.db ,表名:calls

这张表中有个type字段,属性值为常量值:

  1. 来电:CallLog.Calls.INCOMING_TYPE (常量值:1)
  2. 已拨:CallLog.Calls.OUTGOING_TYPE(常量值:2)
  3. 未接:CallLog.Calls.MISSED_TYPE(常量值:3)

这是最常见的,number字段表示电话号码,还有些其他字段就不一一说明了

添加权限

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

前两个权限是读/写联系人的权限,最后一个是写通话记录的权限,这个权限我之前并没有加上,但是在操作通话记录时,Android Studio推荐加上这个权限,否则就会划红线,但是并不影响程序运行

编写代码

系统通过ContentProvider (内容提供器)向外共享。

Uri

CallLog.Calls.CONTENT_URI 等价于:Uri.parse("content://call_log/calls"); 用哪个都可以

获取内容解析器

ContentResolver resolver = getContentResolver();

getContentResolver()方法是Content类的方法

操作内容解析器

其实操作和操作Sqlite的方法几乎一样,比如说删除操作:

resolver.delete(CallLog.Calls.CONTENT_URI, "number=?", new String[]{number});

会删除给定的号码的所有记录,还可以增加个条件(如 type=1),删除给定的号码的来电记录

查询某个联系人的所有通话记录可以使用(query方法)

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

虽然删除了电话号码记录,但是可能会有延迟,所以我们查询电话号码表是否改变了

在MainActivity中增加一个类继承ContentObserver 用来观察电话号码表是否改变,如果发生变化,则再次删除该号码

/**
* ContentObserver 上下文观察者
*/
class CallLogObserver extends ContentObserver {
private String number; public CallLogObserver(String number, Handler handler) {
super(handler);
this.number = number;
} /**
* 如果通话记录发生改变
*
* @param selfChange
*/
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
deleteCallLog(number);
}
}

别忘了调用这个类,通过getContentResolver()获得解析器,再调用registerContentObserver方法,注意最后一个变量给的就是编写的CallLogObserver类

getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, new CallLogObserver(incomingNumber, new Handler()));

最新文章

  1. HTTP Keep-Alive模式
  2. 关于电磁场中的E.B.D.H的理解
  3. ecstore菜鸟电子面单对接摘要
  4. C#中常用的排序算法的时间复杂度和空间复杂度
  5. BI任务列表
  6. js dom操作获取节点的一些方法
  7. iOS堆栈-内存-代码在据算机中的运行
  8. 关于identifier was truncated to &#39;255&#39; characters
  9. &quot;fatal: protocol error: bad line length character: No This&quot;
  10. JSON WEB Token(JWT)
  11. 记一次生产环境thrift服务的配置问题
  12. 运维笔记--ubuntu管理启动项
  13. 解析:为什么程序员应该有一台Mac个人电脑?
  14. python基础(1)-helloworld
  15. html5的鼠标拖拽
  16. R语言读取Hive数据表
  17. [转]Java虚拟机是如何判断变量类型的
  18. Mweb发布博客
  19. Android Studio 无法预览布局问题:com/android/util/PropertiesMap
  20. 云计算之路-阿里云上:SLB会话保持的一个坑

热门文章

  1. JS中获取数据库中的值
  2. React-Native进阶_1.抽取样式和组件
  3. [置顶] Android 关于SP读取与存储正确打开方式?
  4. caffe 卷积层的运算
  5. 【视觉控】3D时钟
  6. 每天一个linux命令(性能、优化):【转载】top命令
  7. spring加载jar包中多个配置文件(转载)
  8. CF1117A Best Subsegment
  9. Codeforces 1030F 【线段树】【好题】
  10. Roslyn 入门:使用 Visual Studio 的语法可视化窗格查看和了解代码的语法树