##day09##
- 清除来电记录
代码挂断电话后,被挂断的号码仍然会进入通话记录中, 我们需要将这种记录删除.
查看数据库contacts2中的表calls
private void deleteCallLog(String number) {
getContentResolver().delete(Uri.parse("content://call_log/calls"),
"number=?", new String[] {number});
}
注意加权限:
- 通过内容观察者,解决通话记录删除失败的问题
系统在往通话记录的数据库中插入数据时是异步逻辑,所以当数据库还没来得及添加电话日志时,我们就执行了删除日志的操作,从而导致删除失败,为了避免这个问题,可以监听数据库变化,当数据库发生变化后,我们才执行删除操作,从而解决这个问题
class MyContentObserver extends ContentObserver {
private String incomingNumber;
public MyContentObserver(Handler handler, String incomingNumber) {
super(handler);
this.incomingNumber = incomingNumber;
}
@Override
public void onChange(boolean selfChange) {
System.out.println("call log changed...");
//删除日志
deleteCallLog(incomingNumber);
//删除完日志后,注销内容观察者
getContentResolver().unregisterContentObserver(mObserver);
}
}
------------------------------
//监听到来电时,注册内容观察者
mObserver = new MyContentObserver(new Handler(),
incomingNumber);
//注册内容观察者
getContentResolver().registerContentObserver(
Uri.parse("content://call_log/calls"), true,
mObserver);
------------------------------
注意:
补充Android2.3模拟器上需要多加权限
- 短信备份
- 查看短信数据库
data/data/com.android.provider.telephony/databases/mmssms.db
address 短信收件人发件人地址
date 短信接收的时间
type 1 发进来短信 2 发出去短信
read 1 已读短信 0 未读短信
body 短信内容
- 读取短信数据库内容
查看系统源码,找到uri地址:packages\provider\platform_packages_providers_telephonyprovider-master
Uri uri = Uri.parse("content://sms/");// 所有短信
Cursor cursor = ctx.getContentResolver().query(uri,
new String[] { "address", "date", "type", "body" }, null, null,
null);
遍历cursor,获取短信信息
注意权限:
- 将短信内容序列化为xml文件
sms.xml
10499949433
1
wos shi haoren
1049994889433
2
hell world hei ma
------------------------------
XmlSerializer serializer = Xml.newSerializer();// 初始化xml序列化工具
serializer.setOutput(new FileOutputStream(output), "utf-8");//设置输出流
serializer.startDocument("utf-8", null);// 生成xml顶栏描述语句