XmlSerializer不能保存emoji表情

时间:2022-07-24 10:13:44

XmlSerializer不能保存emoji表情

本人在Android中学习到备份短信时,需求是这样的,需要将短信备份到xml文件中.踩到一个坑,当XmlSerializer遇到emoji表情时,就会出错,保存xml文件就会失败.最后谷歌找了个别人写的KXmlSerializer(),完美解决这个问题.本人代码如下:

/**
* 备份短信
*
* @param context
* @param allSms
* @return
*/

public static void backupSms(Context mContext, final List<Sms> allSms,
final Handler handler) {

new Thread(new Runnable() {

@Override
public void run() {

FileOutputStream fileOutputStream = null;
File file = null;
try {
// 1.准备文件输出流
file = new File(Environment.getExternalStorageDirectory().getPath()
+ "/sms.xml");
if(!file.exists()){
file.createNewFile();
}

fileOutputStream = new FileOutputStream(file);

// 2.得到XmlSerializer对象
//Android下,如果短信有emoji表情,Xml.newSerializer()则会备份失败
//去百度找了份KXmlSerializer代码,这个可以 不会出错
// XmlSerializer xmlSerializer = Xml.newSerializer();
XmlSerializer xmlSerializer = new KXmlSerializer();

// 2.1设置XmlSerializer的一些参数,比如:设置xml写入到哪个文件中
// os:xml文件写入流 encoding:流的编码
xmlSerializer.setOutput(fileOutputStream, "utf-8");

// 3.序列化一个xml的声明头
// encoding:xml文件的编码 standalone:是否独立
xmlSerializer.startDocument("utf-8", true);

// 4.序列化一个根节点的开始节点
// namespace:命名空间 name: 标签的名称
xmlSerializer.startTag(null, "Smss");

// 5.循环遍历list集合序列化一条条短信

for (Sms sms : allSms) {
xmlSerializer.startTag(null, "Sms");

xmlSerializer.startTag(null, "address");
// 写一个标签的内容
xmlSerializer.text(sms.getAddress());
xmlSerializer.endTag(null, "address");

xmlSerializer.startTag(null, "date");
xmlSerializer.text(sms.getDate());
xmlSerializer.endTag(null, "date");

xmlSerializer.startTag(null, "read");
xmlSerializer.text(sms.getRead() + "");
xmlSerializer.endTag(null, "read");

xmlSerializer.startTag(null, "body");
xmlSerializer.text(sms.getBody());
xmlSerializer.endTag(null, "body");

if (sms.getPerson() != null) {
xmlSerializer.startTag(null, "person");
xmlSerializer.text(sms.getPerson());
xmlSerializer.endTag(null, "person");
}

xmlSerializer.endTag(null, "Sms");
}

// 6.序列化一个根节点的结束节点
xmlSerializer.endTag(null, "Smss");
// 7.将xml写入到文件中,完成xml的序列化
xmlSerializer.endDocument();

// 将需要返回的数据封装到handler中
Message message = new Message();
message.obj = true;
handler.sendMessage(message);

} catch (Exception e) {
// 将需要返回的数据封装到handler中
Message message = new Message();
message.obj = false;
handler.sendMessage(message);
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


}
}).start();

}

附demo下载地址:http://download.csdn.net/detail/xfhy_/9746169

demo里有KXmlSerializer完整代码,由于代码太长,就不在这里发了.