Android笔记——对系统通话记录的删除操作

Posted OverZeal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android笔记——对系统通话记录的删除操作相关的知识,希望对你有一定的参考价值。

手机通话记录是保存在数据库中的,位置:  /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()));

 

以上是关于Android笔记——对系统通话记录的删除操作的主要内容,如果未能解决你的问题,请参考以下文章

Android - 利用内容提供者删除通话记录

删除短信和通话记录权限后无法更新 APK [重复]

Android 语音通话录音无法在系统上播放

我如何更新数据库中的通话记录数据(java android)

由于“使用短信或通话记录”权限,如何解决删除应用程序?

如何从 Android 系统获取回调到应用程序?