安卓中备份和恢复短信

笔者这里的备份短信只是简单的以xml文件形式备份到手机sd卡中,而不是备份到云端。

一、备份短信,备份短信的原理是通过内容提供者读取系统短信的内容并生成xml文件存储到sd卡中。

//得到内容提供者实例
ContentResolver resolver = context.getContentResolver();
//在sd卡生成一个xml文件存放短信内容
        File file = new File(Environment.getExternalStorageDirectory(),
                "sms.xml");
                //输出流
        FileOutputStream fos = new FileOutputStream(file);
        //得到序列化器
        XmlSerializer serializer = Xml.newSerializer();
        serializer.setOutput(fos, "utf-8");
        //设置xml文件的头部
        serializer.startDocument("utf-8", true);
        //设置开始节点
        serializer.startTag(null, "smss");
        //系统短信存放的位置
        Uri uri = Uri.parse("content://sms/");
        //查询系统短信
        Cursor cursor = resolver.query(uri, new String[] { "body", "address",
                "type", "date" }, null, null, null);
                //得到短信的条数
        int max = cursor.getCount();
        //设置条数属性,用于后面的还原
        serializer.attribute(null, "max", max + "");

        //逐条读取短信的内容并生成xml
        while (cursor.moveToNext()) {
            String body = cursor.getString(0);
            String address = cursor.getString(1);
            String type = cursor.getString(2);
            String date = cursor.getString(3);
            //单条短信开始节点
            serializer.startTag(null, "sms");
            serializer.startTag(null, "body");
            serializer.text(body);
            serializer.endTag(null, "body");

            serializer.startTag(null, "address");
            serializer.text(address);
            serializer.endTag(null, "address");

            serializer.startTag(null, "type");
            serializer.text(type);
            serializer.endTag(null, "type");

            serializer.startTag(null, "date");
            serializer.text(date);
            serializer.endTag(null, "date");
            //单条短信结束节点
            serializer.endTag(null, "sms");
        }
        //xml结束节点
        serializer.endTag(null, "smss");
        //xml尾部
        serializer.endDocument();
        fos.close();

执行这段逻辑之后,就会在sd卡根目录生成sms.xml文件。

二、恢复短信,与备份短信相反;恢复短信就是找到sms.xml文件并将其解析出来然后插入到系统短信当中。

File file = new File(Environment.getExternalStorageDirectory(),
                "sms.xml");
                //判断sms.xml是否存在
        if (file.exists() && file.length() > 0) {
            //输入流
            FileInputStream fis = new FileInputStream(file);
            //得到xml文件解析器
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(fis, "utf-8");
            //得到解析的节点类型
            int type = parser.getEventType();
            //逐条解析
            while (type != XmlPullParser.END_DOCUMENT) {
                switch (type) {
                //开始标签
                case XmlPullParser.START_TAG:
                    if ("smss".equals(parser.getName())) {
                    //队列用于存放短信内容
                        List<SmsInfo>  smsInfos = new ArrayList<>();
                        //获取属性,即短信条数
                        String max = parser.getAttributeValue(0);
                    } else if ("sms".equals(parser.getName())) {
                    //bean
                        sms = new SmsInfo();
                    } else if ("body".equals(parser.getName())) {
                    //解析短信内容
                        sms.setBody(parser.nextText());
                    } else if ("address".equals(parser.getName())) {
                    //解析短信发送方
                        sms.setAddress(parser.nextText());
                    } else if ("type".equals(parser.getName())) {
                    //解析短信类型
                        sms.setType(parser.nextText());
                    } else if ("date".equals(parser.getName())) {
                    //解析短信时间
                        sms.setDate(parser.nextText());
                    }

                    break;
        //结束节点
                case XmlPullParser.END_TAG:
                    if ("sms".equals(parser.getName())) {
                    //没解析完一条,就添加到队列中
                        smsInfos.add(sms);
                    }
                    break;
                }
                //返回解析的类型
                type = parser.next();
            }
    //解析完毕后,用内容提供者将短信内容插入到系统中
            ContentResolver resolver = context.getContentResolver();
            Uri uri = Uri.parse("content://sms/");
            for (SmsInfo sms : smsInfos) {
                ContentValues values = new ContentValues();
                values.put("body", sms.getBody());
                values.put("address", sms.getAddress());
                values.put("type", sms.getType());
                values.put("date", sms.getDate());
                resolver.insert(uri, values);
            }
        } else {
            Toast.makeText(context, "没有备份短信", 0).show();
        }

SmsInfo.java:

package com.azhong.mobilesafe.domain;

public class SmsInfo {
    private String body;
    private String address;
    private String type;
    private String date;

    public String getBody() {
        return body;
    }
    public void setBody(String body) {
        this.body = body;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public SmsInfo() {
        super();
        // TODO Auto-generated constructor stub
    }
    public SmsInfo(String body, String address, String type, String date) {
        super();
        this.body = body;
        this.address = address;
        this.type = type;
        this.date = date;
    }
    @Override
    public String toString() {
        return "SmsInfo [body=" + body + ", address=" + address + ", type="
                + type + ", date=" + date + "]";
    }

}

sms.xml:

<smss max="2">
<sms>
<body>nihao</body>
<address>5556</address>
<type>1</type>
<date>1474513704217</date>
</sms>
<sms>
<body>hello</body>
<address>5558</address>
<type>1</type>
<date>1474513695820</date>
</sms>
</smss>

这样,就实现简单的短信备份和恢复功能啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值