说明:短信备份的序列化时候有时出现空指针异常
ps:由于在手机上搞过短信备份与恢复(恢复时没有情况),所以同样的短信都是两条,不要在意这些细节。
serializer.startTag(null, "sms");serializer.startTag(null, "address");String address = cursor.getString(0);serializer.text(address);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();}}



浙公网安备 33010602011771号