安卓中备份和恢复短信
2016-09-22 11:11
423 查看
笔者这里的备份短信只是简单的以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>
这样,就实现简单的短信备份和恢复功能啦。
相关文章推荐
- 第四周 项目1-建立单链表
- 使用Btrace进行线上系统性能分析
- 第四周 建设“单链表”算法库
- TabHost
- 3周项目 顺序表的基本运算
- iOS开发之导航栏titleView不居中的问题
- 时间相关API实战1
- Swift-iOS常用控件(UIActivityIndicatorView 活动指示器)
- 大型程序的结构(一)
- excel中十万级数据导入oracle数据库中的几种方法
- 【读书笔记】Java核心技术-基础知识-反射
- Java对象内存存储,引用传递,值传递详细图解
- 第四周项目3—2.单链表的应用(单链表的递增)
- apache主机重写规则与nginx主机重写规则转换
- 项目中list、String和正则表达式的的一些使用
- PHP 源码加密 (zendGuard和ionCube)
- 第四周项目3-并联电阻
- Infoworld bossie 2016 best open source aword 2016 开源软件获奖项目
- 出现No enclosing instance of type Exp is accessible. Must qualify the allocation with an enclosing ins
- 搭建PXE服务器,推送安装linux系统