短信一键备份和还原

Android 4.0

短信一键备份和还原
短信备份,短信还原,一键短信备份还原

核心代码:
package cn.zengfansheng.smsbackuprestore;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
 
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
 
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Xml;
 
public class SmsUtils {
 
    /**
     * 1、备份短信
     * @param context 上下文
     * @param databasePath 短信数据库路径
     * @return 所有短信的List集合
     */

    public static List<SmsInfo> backupToList(Context context, String databasePath) {
 
        List<SmsInfo> smsInfos = new ArrayList<SmsInfo>();
 
        ContentResolver resolver = context.getContentResolver();
        Uri uri = Uri.parse("content://sms");
 
        Cursor cursor = resolver.query(uri, null, null, null, null);
 
        while (cursor.moveToNext()) {
 
            String address = cursor.getString(cursor.getColumnIndex("address"));
            long date = cursor.getLong(cursor.getColumnIndex("date"));
            int type = cursor.getInt(cursor.getColumnIndex("type"));
            String body = cursor.getString(cursor.getColumnIndex("body"));
 
            SmsInfo smsInfo = new SmsInfo(address, body, type, date);
            smsInfos.add(smsInfo);
        }
        cursor.close();
        return smsInfos;
    }
 
    /**
     * 2、备份短信到xml
     * @param context
     * @param databasePath
     * @throws IOException
     * @throws IllegalStateException
     * @throws IllegalArgumentException
     */

    public static void backupToXml(Context context, String databasePath,
            String backupPath) throws IllegalArgumentException,
            IllegalStateException, IOException {
        List<SmsInfo> smsInfos = backupToList(context, databasePath);
 
        // 1、得到一个xml序列化器
        XmlSerializer serializer = Xml.newSerializer();
 
        // 2、初始化xml序列化器
        File file = new File(backupPath);
        OutputStream out = new FileOutputStream(file );
        serializer.setOutput(out, "utf-8");
        serializer.setPrefix(null, null);
 
        serializer.startDocument("utf-8", true);
        serializer.startTag(null, "smss");
        // 3、写xml
        for (SmsInfo smsInfo : smsInfos) {
            serializer.startTag(null, "sms");
 
            serializer.startTag(null, "address");
            serializer.text(smsInfo.getAddress());
            serializer.endTag(null, "address");
 
            serializer.startTag(null, "date");
            serializer.text(String.valueOf(smsInfo.getDate()));
            serializer.endTag(null, "date");
 
            serializer.startTag(null, "type");
            serializer.text(String.valueOf(smsInfo.getType()));
            serializer.endTag(null, "type");
 
            serializer.startTag(null, "body");
            serializer.text(smsInfo.getBody());
            serializer.endTag(null, "body");
 
            serializer.endTag(null, "sms");
        }
        serializer.endTag(null, "smss");
        serializer.endDocument();
    }
 
    /**
     * 3、从xml中读取短信信息并封装到list集合中
     * @param context
     * @param restorePath
     * @return
     * @throws XmlPullParserException
     * @throws IOException
     */

    public static List<SmsInfo> readXmlToList(Context context,
            String restorePath) throws XmlPullParserException, IOException {
 
        XmlPullParser parser = Xml.newPullParser();
 
        File file = new File(restorePath);
        InputStream in = new FileInputStream(file);
        parser.setInput(in, "utf-8");
 
        List<SmsInfo> smsInfos = null;
        SmsInfo smsInfo = null;
        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
 
            String name = parser.getName();
            switch (eventType) {
            case XmlPullParser.START_TAG:
                if ("smss".equals(name)) {
                    smsInfos = new ArrayList<SmsInfo>();
                } else if ("sms".equals(name)) {
                    smsInfo = new SmsInfo();
                } else if ("address".equals(name)) {
                    String address = parser.nextText();
                    smsInfo.setAddress(address);
                }else if("date".equals(name)) {
                    String date = parser.nextText();
                    smsInfo.setDate(Long.parseLong(date.toString()));
                }else if("type".equals(name)) {
                    String type = parser.nextText();
                    smsInfo.setType(Integer.parseInt(type.toString()));
                }else if("body".equals(name)) {
                    String body = parser.nextText();
                    smsInfo.setBody(body);
                }
                break;
 
            case XmlPullParser.END_TAG:
                if ("sms".equals(name)) {
                    smsInfos.add(smsInfo);
                }
                break;
            }
            eventType = parser.next();
        }
        return smsInfos;
    }
 
    /**
     * 4、恢复短信
     * @param context 上下文
     * @param restorePath 短信备份的xml
     * @throws XmlPullParserException
     * @throws IOException
     */

    public static void restore(Context context, String restorePath)
            throws XmlPullParserException, IOException {
        // 1、读取xml
        List<SmsInfo> smsInfos = readXmlToList(context, restorePath);
 
        // 2、然后写到系统短信中去
        for (SmsInfo smsInfo : smsInfos) {
 
            ContentResolver resolver = context.getContentResolver();
            Uri uri = Uri.parse("content://sms");
            ContentValues values = new ContentValues();
            values.put("address", smsInfo.getAddress());
            values.put("date", smsInfo.getDate());
            values.put("type", smsInfo.getType());
            values.put("body", smsInfo.getBody());
            resolver.insert(uri, values);
        }
    }
}