1.短信备份
package com.su.smsbackuprestore.operatesms;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.xmlpull.v1.XmlSerializer;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
import android.util.Xml;
import android.widget.Toast;
public class ExportSmsXml {
Context context;
public static final String SMS_URI_ALL = "content://sms/";
private FileOutputStream outStream = null;
private XmlSerializer serializer;
public ExportSmsXml(Context context) {
this.context = context;
}
public void xmlStart() {
String path = Environment.getExternalStorageDirectory().getPath() + "/SMSBackup";
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
File file2 = new File(path, "message.xml");
try {
outStream = new FileOutputStream(file2);
serializer = Xml.newSerializer();
serializer.setOutput(outStream, "UTF-8");
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "sms");
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean createXml() throws Exception {
this.xmlStart();
Cursor cursor = null;
try {
ContentResolver conResolver = context.getContentResolver();
String[] projection = new String[] { SmsField.ADDRESS, SmsField.PERSON, SmsField.DATE, SmsField.PROTOCOL,
SmsField.READ, SmsField.STATUS, SmsField.TYPE, SmsField.REPLY_PATH_PRESENT,
SmsField.BODY,SmsField.LOCKED,SmsField.ERROR_CODE, SmsField.SEEN }; // type=1是收件箱,==2是发件箱;read=0表示未读,read=1表示读过,seen=0表示未读,seen=1表示读过
Uri uri = Uri.parse(SMS_URI_ALL);
cursor = conResolver.query(uri, projection, null, null, "_id asc");
if (cursor.moveToFirst()) {
// 查看数据库sms表得知 subject和service_center始终是null所以这里就不获取它们的数据了。
String address;
String person;
String date;
String protocol;
String read;
String status;
String type;
String reply_path_present;
String body;
String locked;
String error_code;
String seen;
do {
// 如果address == null,xml文件中是不会生成该属性的,为了保证解析时,属性能够根据索引一一对应,必须要保证所有的item标记的属性数量和顺序是一致的
address = cursor.getString(cursor.getColumnIndex(SmsField.ADDRESS));
if (address == null) {
address = "";
}
person = cursor.getString(cursor.getColumnIndex(SmsField.PERSON));
if (person == null) {
person = "";
}
date = cursor.getString(cursor.getColumnIndex(SmsField.DATE));
if (date == null) {
date = "";
}
protocol = cursor.getString(cursor.getColumnIndex(SmsField.PROTOCOL));
if (protocol == null) {// 为了便于xml解析
protocol = "";
}
read = cursor.getString(cursor.getColumnIndex(SmsField.READ));
if (read == null) {
read = "";
}
status = cursor.getString(cursor.getColumnIndex(SmsField.STATUS));
if (status == null) {
status = "";
}
type = cursor.getString(cursor.getColumnIndex(SmsField.TYPE));
if (type == null) {
type = "";
}
reply_path_present = cursor.getString(cursor.getColumnIndex(SmsField.REPLY_PATH_PRESENT));
if (reply_path_present == null) {// 为了便于XML解析
reply_path_present = "";
}
body = cursor.getString(cursor.getColumnIndex(SmsField.BODY));
if (body == null) {
body = "";
}
locked = cursor.getString(cursor.getColumnIndex(SmsField.LOCKED));
if (locked == null) {
locked = "";
}
error_code = cursor.getString(cursor.getColumnIndex(SmsField.ERROR_CODE));
if (error_code == null) {
error_code = "";
}
seen = cursor.getString(cursor.getColumnIndex(SmsField.SEEN));
if (seen == null) {
seen = "";
}
// 生成xml子标记
// 开始标记
serializer.startTag(null, "item");
// 加入属性
serializer.attribute(null, SmsField.ADDRESS, address);
serializer.attribute(null, SmsField.PERSON, person);
serializer.attribute(null, SmsField.DATE, date);
serializer.attribute(null, SmsField.PROTOCOL, protocol);
serializer.attribute(null, SmsField.READ, read);
serializer.attribute(null, SmsField.STATUS, status);
serializer.attribute(null, SmsField.TYPE, type);
serializer.attribute(null, SmsField.REPLY_PATH_PRESENT, reply_path_present);
serializer.attribute(null, SmsField.BODY, body);
serializer.attribute(null, SmsField.LOCKED, locked);
serializer.attribute(null, SmsField.ERROR_CODE, error_code);
serializer.attribute(null, SmsField.SEEN, seen);
// 结束标记
serializer.endTag(null, "item");
} while (cursor.moveToNext());
} else {
return false;
}
} catch (SQLiteException ex) {
ex.printStackTrace();
Log.d("SQLiteException:", ex.getMessage());
}finally {
if(cursor != null) {
cursor.close();//手动关闭cursor,及时回收
}
}
serializer.endTag(null, "sms");
serializer.endDocument();
outStream.flush();
outStream.close();
return true;
}
}
2.短信恢复
package com.su.smsbackuprestore.operatesms;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.Looper;
import android.util.Log;
import android.util.Xml;
import android.widget.Toast;
public class ImportSms {
private Context context;
private List<SmsItem> smsItems;
private ContentResolver conResolver;
public ImportSms(Context context) {
this.context = context;
conResolver = context.getContentResolver();
}
@SuppressWarnings("unchecked")
public void testInsertSMS() {
/**
* 放一个解析xml文件的模块
*/
smsItems = this.getSmsItemsFromXml();
Log.d("sqk", "after smsItems");
for (SmsItem item : smsItems) {
// 判断短信数据库中是否已包含该条短信,如果有,则不需要恢复
Cursor cursor = conResolver.query(Uri.parse("content://sms"), new String[] { SmsField.DATE }, SmsField.DATE + "=?",
new String[] { item.getDate() }, null);
if (!cursor.moveToFirst()) {// 没有该条短信
ContentValues values = new ContentValues();
values.put(SmsField.ADDRESS, item.getAddress());
// 如果是空字符串说明原来的值是null,所以这里还原为null存入数据库
values.put(SmsField.PERSON, item.getPerson().equals("") ? null : item.getPerson());
values.put(SmsField.DATE, item.getDate());
values.put(SmsField.PROTOCOL, item.getProtocol().equals("") ? null : item.getProtocol());
values.put(SmsField.READ, item.getRead());
values.put(SmsField.STATUS, item.getStatus());
values.put(SmsField.TYPE, item.getType());
values.put(SmsField.REPLY_PATH_PRESENT, item.getReply_path_present().equals("") ? null : item.getReply_path_present());
values.put(SmsField.BODY, item.getBody());
values.put(SmsField.LOCKED, item.getLocked());
values.put(SmsField.ERROR_CODE, item.getError_code());
values.put(SmsField.SEEN, item.getSeen());
conResolver.insert(Uri.parse("content://sms"), values);
}
cursor.close();
}
}
// public void delete() {
//
// conResolver.delete(Uri.parse("content://sms"), null, null);
// }
public List<SmsItem> getSmsItemsFromXml(){
SmsItem smsItem = null;
XmlPullParser parser = Xml.newPullParser();
String absolutePath = Environment.getExternalStorageDirectory() + "/SMSBackup/message.xml";
File file = new File(absolutePath);
if (!file.exists()) {
Looper.prepare();
Toast.makeText(context, "message.xml短信备份文件不在sd卡中", 1).show();
Looper.loop();//退出线程
// return null;
}
try {
FileInputStream fis = new FileInputStream(file);
parser.setInput(fis, "UTF-8");
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
smsItems = new ArrayList<SmsItem>();
break;
case XmlPullParser.START_TAG: // 如果遇到开始标记,如<smsItems>,<smsItem>等
if ("item".equals(parser.getName())) {
smsItem = new SmsItem();
smsItem.setAddress(parser.getAttributeValue(0));
smsItem.setPerson(parser.getAttributeValue(1));
smsItem.setDate(parser.getAttributeValue(2));
smsItem.setProtocol(parser.getAttributeValue(3));
smsItem.setRead(parser.getAttributeValue(4));
smsItem.setStatus(parser.getAttributeValue(5));
smsItem.setType(parser.getAttributeValue(6));
smsItem.setReply_path_present(parser.getAttributeValue(7));
smsItem.setBody(parser.getAttributeValue(8));
smsItem.setLocked(parser.getAttributeValue(9));
smsItem.setError_code(parser.getAttributeValue(10));
smsItem.setSeen(parser.getAttributeValue(11));
}
break;
case XmlPullParser.END_TAG:// 结束标记,如</smsItems>,</smsItem>等
if ("item".equals(parser.getName())) {
smsItems.add(smsItem);
smsItem = null;
}
break;
}
event = parser.next();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
Looper.prepare();
Toast.makeText(context, "短信恢复出错", 1).show();
Looper.loop();
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
Looper.prepare();
Toast.makeText(context, "短信恢复出错", 1).show();
Looper.loop();
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
Looper.prepare();
Toast.makeText(context, "短信恢复出错", 1).show();
Looper.loop();
e.printStackTrace();
}
return smsItems;
}
}
3.辅助
package com.su.smsbackuprestore.operatesms;
public class SmsField {
public static final String ADDRESS = "address";
public static final String PERSON = "person";
public static final String DATE = "date";
public static final String PROTOCOL = "protocol";
public static final String READ = "read";
public static final String STATUS = "status";
public static final String TYPE = "type";
public static final String REPLY_PATH_PRESENT = "reply_path_present";
public static final String BODY = "body";
public static final String LOCKED = "locked";
public static final String ERROR_CODE = "error_code";
public static final String SEEN = "seen";
}
package com.su.smsbackuprestore.operatesms;
public class SmsItem {
String address;
String person;
String date;
String protocol;
String read;
String status;
String type;
String reply_path_present;
String body;
String locked;
String error_code;
String seen;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPerson() {
return person;
}
public void setPerson(String person) {
this.person = person;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getRead() {
return read;
}
public void setRead(String read) {
this.read = read;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getReply_path_present() {
return reply_path_present;
}
public void setReply_path_present(String reply_path_present) {
this.reply_path_present = reply_path_present;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getLocked() {
return locked;
}
public void setLocked(String locked) {
this.locked = locked;
}
public String getError_code() {
return error_code;
}
public void setError_code(String error_code) {
this.error_code = error_code;
}
public String getSeen() {
return seen;
}
public void setSeen(String seen) {
this.seen = seen;
}
}