博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
短信备份BUG(空指针异常)调试
阅读量:6574 次
发布时间:2019-06-24

本文共 2607 字,大约阅读时间需要 8 分钟。

说明:短信备份的序列化时候有时出现空指针异常

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

转载于:https://www.cnblogs.com/loveandroid/p/3802037.html

你可能感兴趣的文章
Android一种常见的布局困扰
查看>>
ReactNative字体大小不随系统字体大小变化而变化
查看>>
中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
查看>>
为什么中台是传统企业数字化转型的关键?
查看>>
使用模板将Web服务的结果转换为标记语言
查看>>
inno setup 打包脚本学习
查看>>
php 并发控制中的独占锁
查看>>
从pandas到geopandas
查看>>
用express搭建网站
查看>>
如何在 Swift 中进行错误处理
查看>>
[Leetcode] Factor Combinations 因数组合
查看>>
用tinypng插件创建gulp task压缩图片
查看>>
浅谈DOMContentLoaded事件及其封装方法
查看>>
BetaMeow----利用机器学习做五子棋AI
查看>>
APM终端用户体验监控分析(下)
查看>>
React Native 0.20官方入门教程
查看>>
JSON for Modern C++ 3.6.0 发布
查看>>
Tomcat9.0部署iot.war(环境mysql8.0,centos7.2)
查看>>
我的友情链接
查看>>
Cisco设备配置snmp
查看>>