您的位置:首页 > 其它

安卓中备份和恢复短信

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>


这样,就实现简单的短信备份和恢复功能啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: