Android 调用系统的ContentProvider

1.调用系统的ContentProvider
Android系统提供了一些定义好的ContentProvider,可以根据这些ContentProvider的Uri得到相应的数据。比方说想获得手机短信的信息,或者想获得图库、联系人信息…必定有相应的Uri与之对应。知道对应的Uri后,就可以通过ContentResolver对象,根据Uri进行数据访问。

2.举例—手机短信数据的读写
根据Uri获取手机短信的信息,并将其备份和恢复:
在这里插入图片描述
首先在DDMS中向模拟器中发几条短信,然后运行程序,点击备份,提示备份成功后,将所有的短信删除,然后点击恢复,打开短信界面发现刚才删除的短信已经恢复,这就是我们要实现的功能。
首先分析一下怎么实现上述效果,如果想备份短信,首先要做的就是获取短信的列表,这一步比较简单,因为谷歌已经封装好,我们要做的就是用Uri去查询短信库,然后拿到数据后需要将数据以XML的形式保存到SD卡里面,当然用其它的方式也可以,只要能将其恢复就行。最后恢复的时候将指定路径的XML文件解析,根据Uri将解析的短信数据插入到系统的短信列表中。
了解了大概思路后,另一个重要的任务就是看看短信的表结构,在模拟器中它的路径是data->data->com.android.providers.telephony->databases下,如下图:
在这里插入图片描述
把它导出来,然后用Sqlite数据打开可以看到数据的结构,这里只关心threads表和sms表就够了,threads代表所有会话信息,每个会话代表和一个联系人之间短信的群组;sms代表短信具体信息。在sms表中的thread_id指向了threads表中的_id,指定每条短信的会话id,以便对短信进行分组。
threads表的结构如下:
在这里插入图片描述
_id:会话id,用于区分不同的电话号码,系统会为不同的电话号码分配不同的_id。
date:收到信息的时间(如果收到来自同一个phone number多条信息,并且有对于一条信息未读,那么date表示收到的最后一条信息时的时间)
message_count:收到的信息的数目
read: 0. 代表未读; 1.代表已读

sms表的结构如下:
在这里插入图片描述
_id:用于区分不同的短信
date::该条短信接收的时间
read:0表未读,1表已读
body: 具体的短信内容

访问手机短信的Uri,主要有以下这么几个:
content://sms/ 所有短信
content://sms/inbox 收件箱
content://sms/sent 已发送
content://sms/draft 草稿
content://sms/outbox 发件箱
content://sms/failed 发送失败
content://sms/queued 待发送列表
这里使用content://sms/,备份所有的短信。

首先要做的就是根据Uri获取短信的列表,这里新建一个SmsManage类,将备份和恢复的方法放到这个类中。
//获取短信列表
public List< SmsData> getSmsList() {
Uri uri = Uri. parse( “content://sms/”);
ContentResolver contentResolver = mContext.getContentResolver();
Cursor cursor = contentResolver.query(uri, null, null, null, null);
if ( null != cursor) {
Log. i( TAG, “cursor.getCount():” + cursor.getCount());
//根据Cursor一条一条的添加到smsList中
while (cursor.moveToNext()) {
int _id = cursor.getInt( cursor.getColumnIndex("_id" ));
int type = cursor.getInt( cursor.getColumnIndex(“type” ));
String address = cursor.getString( cursor.getColumnIndex( “address”));
String body = cursor.getString( cursor.getColumnIndex(“body” ));
String date = cursor.getString( cursor.getColumnIndex(“date” ));
SmsData smsData = new SmsData(_id, type, address, body, date);
smsList.add(smsData);
}
cursor.close();
}
return smsList;
}
根据content://sms/这个Uri查询手机中短信的数据库,得到一个Cursor,这个Cursor就包含了一条一条的短信。然后去遍历这个Cursor将需要的数据添加到smsList中。这样短信数据就拿到了,因为要做的功能是短信备份,所以接下来需要将smsList这个集合中的数据保存到本地,以方便短信恢复的时候去读取保存的这个文件,那么问题来了,怎样将smsList这个集合以文件的形式保存到本地呢?当然方法有很多,这里采用的是使用XmlSerializer将其序列化,需要恢复的时候使用XmlPullParser 将其反序列化,就可以拿到备份的数据,听起来感觉挺高大上的,其实很简单就是对xml的操作。
下面来看看序列化的代码,即将上面得到的集合smsList中的数据生成一个xml文件,并保存到本地。:
//将短信数据保存到 sd卡中
public void saveSmsToSdCard(){
smsList=getSmsList();
//获得一个序列化对象
XmlSerializer xmlSerializer=Xml.newSerializer();
//xml文件保存到sd卡中名字为"sms.xml"
File file=

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值