说明:短信备份的序列化时候有时出现空指针异常
ps:由于在手机上搞过短信备份与恢复(恢复时没有情况),所以同样的短信都是两条,不要在意这些细节。
serializer.startTag(null, "sms");
serializer.startTag(null, "address");
String address = cursor.getString(0);
serializer.endTag(null, "address");
上次毕业设计的时候把短信箱清空,又能正常运行了,怀疑短信数据库中有可能出现了问题,导出短信数据库一看究竟。
通过观察数据库和对比log日志发现:
出现错误的地方为一条草稿短信,该短信没有写姓名即address,所以在序列化的时候java.lang.NullPointerException
解决方法:
serializer.text(address+"");//解决空指针异常
短信备份工具类源码如下:
package com.itheima.mobilesafe.utils;
import java.io.File;
import java.io.FileOutputStream;
import org.xmlpull.v1.XmlSerializer;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Xml;
public class SmsTools {
//定义一个接口 。 暴露一些回调函数。
public interface BackUpCallBack{
/**
* 当短信备份前调用的方法
* @param total 总的短信个数
*/
public void beforeSmsBackup(int total);
/**
* 短信备份中调用的方法
* @param progress 当前备份的进度。
*/
public void onSmsBackup(int progress);
}
/**
* 备份短信
* @param context 上下文
* @param path 短信备份后文件的路径
* @param pb 进度条
* @param pd 进度条对话框
*
*/
public static void backup(Context context,String path,BackUpCallBack backupCallback) throws Exception{
XmlSerializer serializer = Xml.newSerializer();//得到XML的序列化器
//指定序列化器的参数
File file = new File(path);
FileOutputStream fos = new FileOutputStream(file);
serializer.setOutput(fos, "utf-8");//设定保存位置和编码
serializer.startDocument("UTF-8", true);//指定头\独立XML文件
serializer.startTag(null, "smss");//开头节点
ContentResolver resolver = context.getContentResolver();
Uri uri = Uri.parse("content://sms/");
Cursor cursor = resolver.query(uri, new String[]{"address","date","type","body"}, null, null, null);
backupCallback.beforeSmsBackup(cursor.getCount());
int progress = 0;
while(cursor.moveToNext()){
serializer.startTag(null, "sms");
serializer.startTag(null, "address");
String address = cursor.getString(0);
serializer.text(address+"");//解决空指针异常
serializer.text(address);
serializer.endTag(null, "address");
serializer.startTag(null, "date");
String date = cursor.getString(1);
serializer.text(date);
serializer.endTag(null, "date");
serializer.startTag(null, "type");
String type = cursor.getString(2);
serializer.text(type);
serializer.endTag(null, "type");
serializer.startTag(null, "body");
String body = cursor.getString(3);
serializer.text(body);
serializer.endTag(null, "body");
System.out.println("发件人:"+address+"\t信息:"+body);
serializer.endTag(null, "sms");
progress++;
backupCallback.onSmsBackup(progress);
}
cursor.close();
serializer.endTag(null, "smss");
serializer.endDocument();
fos.close();
}
}