android使用xml备份短信

很多手机助手都有备份短信的功能.原理是先读取用户手机中短信,然后将读取的数据放到服务其中,恢复短信的时候再从服务器中读取备份的短信,将其写入到手机中.安卓系统提供相关API 来读取短信.
安卓保护数据安全的原则之一是一个应用不能直接访问其他应用的私有数据.如果两个应用有相同的Linux user Id(android 中每个应用相当于Linux中的一个用户) ,则他们能够访问彼此的数据.默认情况下其他应用是不能直接获取短信应用中的短信,那么其它应用是如何获取到短信的?
安卓的四大组件中有一个是Content Provider,使用Content Provider ,既然分享应用的私有数据,又能保证应用数据的安权.安卓提供了android.provider.Telephony.Sms类,通过这个类,我们可以读取手机中的短信.

声明读取短信的权限

短信涉及到个人隐私,如果 应用需要读取短信,要声明读取短信的权限.在AndriodManifes中添加如下语句.

<uses-permission android:name="android.permission.READ_SMS"/>

获取手机中的短信

查看android.provider.Telephony.Sms的源码,其中有个字段是CONTENT_URI ,不过这个字段是在API19的才加进去的的.再具体看下CONTENT_URI,

public static final Uri CONTENT_URI = Uri.parse("content://sms");

使用CONTENT_URI,只是为了获取读取断线表的uri,我们可以自己钩子一个Uri,用来读取短信表,代码如下,我们可以通过READ_SMS_URI来读取手机中短信

public static final Uri READ_SMS_URI = Uri.parse("content://sms");

读取数据库中的信息,需要使用Curosr.下面代码读取短信表中的所有信息,并返回一个Cursor,这个Cursor包含所有的短信信息.

CursorLoader readSmsLoader = new CursorLoader(context,READ_SMS_URI,null,null,null,null);
Cursor readSmsCursor = smsLoader.loadInBackground();

这里使用了CursorLoader,CursorLoader会另开一个线程进行查询操作,而不是在UI线程中查询,就算查询的数据很多,也不会阻塞UI线程.
CursorLoader有两个重载构造方法,

public CursorLoader(Context context)
public CursorLoader(Context context, Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)

使用第二个构造方法,传入不同的参数,可以查询不同的数据,获取不同的结果.如果后四个参数全部为null,则返回短信的所有信息,每条短信有20个相关信息,备份短信时,并不需要获取短信的全部信息,只要获取其中部分信息即可.我们要获取的信息有address(号码),body(短信内容),date(接收短信的时间),type(短信的类型,是发出去的短信还是接收的短信).重写上面的代码,只返回我们想要的信息,我们不需要的信息则不返回

public List<Message> getSms() {
        List<Message> messages = new ArrayList<>();
        String[] projection = new String[]{Message.ADDRESS,Message.BODY,Message.DATE, Message.TYPE};
        CursorLoader readSmsLoader = new CursorLoader(MainActivity.this,READ_SMS_URI,projection,null,null,null);
        Cursor readSmsCursor = readSmsLoader.loadInBackground();
        if(readSmsCursor.moveToFirst()){
            do {
                String address = readSmsCursor.getString(0);
                String body = readSmsCursor.getString(1);
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值