import java.io.File;
import java.io.FileOutputStream;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.os.SystemClock;
import android.util.Xml;
import android.widget.Toast;
public class SmsUtils {
/**
*
* @param ctx
* @param backupListener 备份短信的回调接口
*/
public static void backupSms(Context ctx,OnBackupListener backupListener){
// 判断是否有SD卡,以及,SD卡空间是否足够
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
// 没有SD卡
Toast.makeText(ctx, "没有SD卡,无法备份短信", 0).show();
return ;
}
// 判断SD卡空间是否够10M
File sdFile = Environment.getExternalStorageDirectory();
if(sdFile.getFreeSpace() < 10*1024*1024){
Toast.makeText(ctx, "SD卡空间不足,无法备份短信", 0).show();
return ;
}
try {
Uri uri = Uri.parse("content://sms");
String[] projection = new String[] { "address", "date", "type","body" };
Cursor cursor = ctx.getContentResolver().query(uri, projection,null, null, null);
// 设置总数
//
proDlg.setMax(cursor.getCount()); //
//
progBar.setMax(cursor.getCount()); //
if(backupListener!=null){
backupListener.onGetTotalCount(cursor.getCount());
}
XmlSerializer serializer = Xml.newSerializer();
String path = Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/backup_sms_z10.xml";
serializer.setOutput(new FileOutputStream(path), "UTF-8");
serializer.startDocument("UTF-8", true); // true 说明是一个单独的文件
serializer.startTag(null, "smss");// <smss>
serializer.attribute(null, "size", ""+cursor.getCount()); // <smss size = "20">
int currProg = 0; // 当前进度
// 查询数据库,返回的cursor 指向,第一行的上一行
while (cursor.moveToNext()) {
String address = cursor.getString(0); // 电话号码
String date = cursor.getString(1); // 日期
String type = cursor.getString(2); // 类型,1收到的,2是发送的
String body = cursor.getString(3); // 短信内容
serializer.startTag(null, "sms");
// <address>234234</address>
serializer.startTag(null, "address");
serializer.text(address);
serializer.endTag(null, "address");
// <data>12312333543</data>
serializer.startTag(null, "date");
serializer.text(date);
serializer.endTag(null, "date");
serializer.startTag(null, "type");
serializer.text(type);
serializer.endTag(null, "type");
serializer.startTag(null, "body");
serializer.text(body);
serializer.endTag(null, "body");
serializer.endTag(null, "sms");
SystemClock.sleep(100); // 休眠一会儿,模拟短信比较多,比较费时的情况
// 设置更新的进度
currProg++;
//
proDlg.setProgress(currProg);
//
progBar.setProgress(currProg);
if(backupListener!=null){
backupListener.onProgressChanged(currProg);
}
}
serializer.endTag(null, "smss");// </smss>
serializer.endDocument();
serializer.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 声明一个接口,当备份进度发生改变时的回调接口
* @author leo
*/
public interface OnBackupListener{
/**
* 当获得短信总数时,回调此方法
* @param totalCount 短信总数
*/
void onGetTotalCount(int totalCount);
/**
* 当备份进度发生变化时,回调此方法
* @param currProg 当前进度
*/
void onProgressChanged(int currProg);
}
/**
*
* @param ctx
*/
public static void restoreSms(Context ctx) {
// 读取XML文件并解析 ,
XmlPullParser parser = Xml.newPullParser();
//
parser.setInput(fileInputStream, "UTF-8");
try {
int eventType = parser.getEventType();
while(eventType!=XmlPullParser.END_DOCUMENT){
//
switch 判断看是开始,还是结束
// 获得一条短信的内容
// 将内容插入数据库
//
ctx.getContentResolver().insert(uri, values)
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
}