Android 实现短信的备份恢复

88 篇文章 0 订阅

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;
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值