标签:div out 否则 程序 null 等价 query new 字段
手机通话记录是保存在数据库中的,位置: /data/data/com.android.providers.contacts/databases/calllog.db ,表名:calls
这张表中有个type字段,属性值为常量值:
这是最常见的,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 (内容提供器)向外共享。
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()));
标签:div out 否则 程序 null 等价 query new 字段
原文地址:http://www.cnblogs.com/lz2017/p/6682885.html