三星手机联系人记录导入到小米4中的方法
2015-12-16 11:23
369 查看
三星手机导入来的文件是xml格式,小米手机不是xml格式。具体来讲,三星手机导出的联系人信息和短息都是xml格式的,而小米手机的联系人导出是vcf格式,短息导出的是csv格式,因此如果你把三星手机的备份导入小米时会遇到一些问题。网上有一些转换软件,大多都是exe文件,我一般不喜欢直接执行未知的exe文件,尤其是为了导入手机联系人,去执行一个未知的可执行文件,风险比较大。因此我选择了自己编码,把xml文件转成小米识别的vcf格式和csv格式文件。
当然需要使用工具把三星手机中的数据导出备份出来,转换后再用小米应用把数据导入到小米手机中。闲话少叙,直接贴代码过来,只要你会使用java编程,你就可以做到。
过程中遇到转换后的文件,导入小米时出现乱码的情况,这时需要用Nodepad++把vcf文件转成以UTF-8无BOM格式编码,再导入就不会出现乱码了。
代码中用到了logger输出日志,你可以用别的方式输出日志比如system.out.println,或者不输出,把其删除;输出数据内容的类是DebugLog,该类也是自己编写的一个类,你可以使用别的方式输出数据,因此这个需要自己编写,如果需要的话我把它放在了附件里,可以参考。
* @Description:采用DOM解析XML文件
* 三星手机I9128v导出电话和短信,导出文件格式为xml格式,
* 导入到小米4手机中,格式为vcf格式
* 三星电话联系人xml文件内容:
* <Contacts>
* <Contact>
* <Name>妈</Name>
* <Starred>0</Starred>
* <PhoneList>
* <Phone Type="2">12345678901</Phone>
* </PhoneList>
* <Account value="0">
* <Name>vnd.sec.contact.phone</Name>
* <Type>vnd.sec.contact.phone</Type>
* </Account>
* <GroupList>
* <GroupName>家人</GroupName>
* </GroupList>
* </Contact>
* </Contacts>
* 小米4电话联系人vcf格式:
* BEGIN:VCARD
* VERSION:3.0
* N:朱;锦松;;;
* FN:朱锦松
* TEL;TYPE=CELL:12345678901 //手机
* TEL;TYPE=CELL:222 //手机
* TEL;TYPE=WORK:025999999 //工作
* TEL;TYPE=HOME:222 //家庭
* TEL;TYPE=PREF:025666666 //总机
* TEL;TYPE=VOICE:222 //其他
* END:VCARD
*
*/
package dom;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DomXML {
private Logger logger;
private DebugLog exportor;
public DomXML() {
exportor = DebugLog.getSharedLog();
logger = LoggerFactory.getLogger(DomXML.class);
}
//转vcf格式,转后要用Notepad++转为UTF-8无BOM格式文件,才能导入到小米手机联系人中
public void domXMLToVCF(String fileName) {
try {
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputStream input = new FileInputStream(fileName);
Document doc = domBuilder.parse(input);
Element root = doc.getDocumentElement();
NodeList telPhones = root.getChildNodes();
StringBuilder sb = new StringBuilder();
if(telPhones != null) {
logger.debug("电话联系人数量:"+telPhones.getLength());
boolean flag = false;
for(int i=0, size=telPhones.getLength(); i < size; i++) {
Node telphone = telPhones.item(i);
if(telphone.getFirstChild() == null) continue;
flag = false;
for(Node node = telphone.getFirstChild(); node != null; node = node.getNextSibling()) {
if(node.getNodeName().equals("PhoneList")) {
flag = true;
break;
}
}
if(!flag) continue;
exportor.log("BEGIN:VCARD");//输出开始头: BEGIN:VCARD
exportor.log("VERSION:3.0");
for(Node node = telphone.getFirstChild(); node != null; node = node.getNextSibling()) {
if(node.getNodeType() == Node.ELEMENT_NODE) {
if(node.getNodeName().equals("Name")) {
String name = node.getFirstChild().getNodeValue();
logger.debug(name);
if(name.length() == 1) {
exportor.log("N:;" + name + ";;;");
exportor.log("FN:" + name);
} else {
exportor.log("N:" + name.substring(0,1) + ";" + name.substring(1) + ";;;");
exportor.log("FN:" + name);
}
}
if(node.getNodeName().equals("PhoneList")) {
NodeList phones = node.getChildNodes();
if(phones != null) {
int phoneNum = 0;
for(int j=0, size2=phones.getLength(); j<size2; j++) {
Node phone = phones.item(j);
if(phone.getNodeType() == Node.ELEMENT_NODE) {
String type2 = phone.getAttributes().getNamedItem("Type").getNodeValue();
if("1".equals(type2)) {
logger.debug("是家庭电话:" + phone.getFirstChild().getNodeValue());
exportor.log("TEL;TYPE=HOME:" + phone.getFirstChild().getNodeValue());
}
if("2".equals(type2)) {
if(phoneNum >= 2) {
logger.error("手机号码超过两个!");
if(phoneNum == 2) exportor.log("TEL;TYPE=PREF:" + phone.getFirstChild().getNodeValue());
if(phoneNum == 3) exportor.log("TEL;TYPE=VOICE:" + phone.getFirstChild().getNodeValue());
} else {
logger.debug("是手机电话:" + phone.getFirstChild().getNodeValue());
exportor.log("TEL;TYPE=CELL:" + phone.getFirstChild().getNodeValue());
}
phoneNum ++;
}
if("3".equals(type2)) {
logger.debug("是工作电话:" + phone.getFirstChild().getNodeValue());
exportor.log("TEL;TYPE=WORK:" + phone.getFirstChild().getNodeValue());
}
}
}
}
}
}
}
if(telphone.getFirstChild() != null) {
exportor.log("END:VCARD");
}
}
}
} catch(FileNotFoundException | ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch(IOException e2) {
e2.printStackTrace();
} finally {
exportor.closeLog();
}
}
public void domXMLToCSV(String fileName) {
exportor.log("电话号码,时间,短信内容,位置,类型,状态");
try {
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputStream input = new FileInputStream(fileName);
Document doc = domBuilder.parse(input);
Element root = doc.getDocumentElement();
NodeList smsPhones = root.getChildNodes();
StringBuilder sb = new StringBuilder();
String date="",body="",address="",type="";
int smsNum = 0;
if(smsPhones != null) {
logger.debug("短信数量:"+smsPhones.getLength());
for(int i=0, size=smsPhones.getLength(); i < size; i++) {
Node smsphone = smsPhones.item(i);
if(smsphone.getFirstChild() == null) continue;
smsNum++;
for(Node node = smsphone.getFirstChild(); node != null; node = node.getNextSibling()) {
if(node.getNodeType() == Node.ELEMENT_NODE) {
if(node.getNodeName().equals("Address")) {
address = node.getFirstChild().getNodeValue();
logger.debug(address);
}
if(node.getNodeName().equals("Date")) {
date = node.getFirstChild().getNodeValue();
logger.debug(date);
}
if(node.getNodeName().equals("Body")) {
body = node.getFirstChild().getNodeValue();
int loc = body.indexOf("\"");
if(loc >= 0) {
body = body.replaceAll("\"", "\"\"");
logger.debug(body);
} else
logger.debug(body);
}
if(node.getNodeName().equals("Type")) {
type = node.getFirstChild().getNodeValue();
}
}
}
if("1".equals(type)) {//接收短信
sb.append(address);sb.append(",");sb.append(date);
sb.append(",\"");sb.append(body);sb.append("\",收到,短信,NONE");
} else if("2".equals(type)) {//发送短信
sb.append(address);sb.append(",");sb.append(date);
sb.append(",\"");sb.append(body);sb.append("\",发送,短信,完成");
} else
logger.error("错误!");
exportor.log(sb.toString());
sb.delete(0, sb.length());
}
logger.debug("有效短信数量:" + smsNum);
}
} catch(FileNotFoundException | ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch(IOException e2) {
e2.printStackTrace();
} finally {
exportor.closeLog();
}
}
public static void main(String[] args) {
DomXML xmlTest = new DomXML();
xmlTest.writeToLogFile("E:/smsresult.csv");
// xmlTest.domXMLToVCF("E:/Contact_QQPhoneManager(2015-12-11).xml");//转vcf格式,转后要用Notepad++转为UTF-8无BOM格式文件,才能导入到小米手机联系人中
xmlTest.domXMLToCSV("E:/Sms_QQPhoneManager(2015-12-11).xml");//转csv格式
}
public void writeToLogFile(String logFile) {
File file = new File(logFile);
exportor.logTo(file);
}
public void closeLogFile() {
logger.debug("关闭导出文件。");
exportor.closeLog();
}
}
当然需要使用工具把三星手机中的数据导出备份出来,转换后再用小米应用把数据导入到小米手机中。闲话少叙,直接贴代码过来,只要你会使用java编程,你就可以做到。
过程中遇到转换后的文件,导入小米时出现乱码的情况,这时需要用Nodepad++把vcf文件转成以UTF-8无BOM格式编码,再导入就不会出现乱码了。
代码中用到了logger输出日志,你可以用别的方式输出日志比如system.out.println,或者不输出,把其删除;输出数据内容的类是DebugLog,该类也是自己编写的一个类,你可以使用别的方式输出数据,因此这个需要自己编写,如果需要的话我把它放在了附件里,可以参考。
* @Description:采用DOM解析XML文件
* 三星手机I9128v导出电话和短信,导出文件格式为xml格式,
* 导入到小米4手机中,格式为vcf格式
* 三星电话联系人xml文件内容:
* <Contacts>
* <Contact>
* <Name>妈</Name>
* <Starred>0</Starred>
* <PhoneList>
* <Phone Type="2">12345678901</Phone>
* </PhoneList>
* <Account value="0">
* <Name>vnd.sec.contact.phone</Name>
* <Type>vnd.sec.contact.phone</Type>
* </Account>
* <GroupList>
* <GroupName>家人</GroupName>
* </GroupList>
* </Contact>
* </Contacts>
* 小米4电话联系人vcf格式:
* BEGIN:VCARD
* VERSION:3.0
* N:朱;锦松;;;
* FN:朱锦松
* TEL;TYPE=CELL:12345678901 //手机
* TEL;TYPE=CELL:222 //手机
* TEL;TYPE=WORK:025999999 //工作
* TEL;TYPE=HOME:222 //家庭
* TEL;TYPE=PREF:025666666 //总机
* TEL;TYPE=VOICE:222 //其他
* END:VCARD
*
*/
package dom;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DomXML {
private Logger logger;
private DebugLog exportor;
public DomXML() {
exportor = DebugLog.getSharedLog();
logger = LoggerFactory.getLogger(DomXML.class);
}
//转vcf格式,转后要用Notepad++转为UTF-8无BOM格式文件,才能导入到小米手机联系人中
public void domXMLToVCF(String fileName) {
try {
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputStream input = new FileInputStream(fileName);
Document doc = domBuilder.parse(input);
Element root = doc.getDocumentElement();
NodeList telPhones = root.getChildNodes();
StringBuilder sb = new StringBuilder();
if(telPhones != null) {
logger.debug("电话联系人数量:"+telPhones.getLength());
boolean flag = false;
for(int i=0, size=telPhones.getLength(); i < size; i++) {
Node telphone = telPhones.item(i);
if(telphone.getFirstChild() == null) continue;
flag = false;
for(Node node = telphone.getFirstChild(); node != null; node = node.getNextSibling()) {
if(node.getNodeName().equals("PhoneList")) {
flag = true;
break;
}
}
if(!flag) continue;
exportor.log("BEGIN:VCARD");//输出开始头: BEGIN:VCARD
exportor.log("VERSION:3.0");
for(Node node = telphone.getFirstChild(); node != null; node = node.getNextSibling()) {
if(node.getNodeType() == Node.ELEMENT_NODE) {
if(node.getNodeName().equals("Name")) {
String name = node.getFirstChild().getNodeValue();
logger.debug(name);
if(name.length() == 1) {
exportor.log("N:;" + name + ";;;");
exportor.log("FN:" + name);
} else {
exportor.log("N:" + name.substring(0,1) + ";" + name.substring(1) + ";;;");
exportor.log("FN:" + name);
}
}
if(node.getNodeName().equals("PhoneList")) {
NodeList phones = node.getChildNodes();
if(phones != null) {
int phoneNum = 0;
for(int j=0, size2=phones.getLength(); j<size2; j++) {
Node phone = phones.item(j);
if(phone.getNodeType() == Node.ELEMENT_NODE) {
String type2 = phone.getAttributes().getNamedItem("Type").getNodeValue();
if("1".equals(type2)) {
logger.debug("是家庭电话:" + phone.getFirstChild().getNodeValue());
exportor.log("TEL;TYPE=HOME:" + phone.getFirstChild().getNodeValue());
}
if("2".equals(type2)) {
if(phoneNum >= 2) {
logger.error("手机号码超过两个!");
if(phoneNum == 2) exportor.log("TEL;TYPE=PREF:" + phone.getFirstChild().getNodeValue());
if(phoneNum == 3) exportor.log("TEL;TYPE=VOICE:" + phone.getFirstChild().getNodeValue());
} else {
logger.debug("是手机电话:" + phone.getFirstChild().getNodeValue());
exportor.log("TEL;TYPE=CELL:" + phone.getFirstChild().getNodeValue());
}
phoneNum ++;
}
if("3".equals(type2)) {
logger.debug("是工作电话:" + phone.getFirstChild().getNodeValue());
exportor.log("TEL;TYPE=WORK:" + phone.getFirstChild().getNodeValue());
}
}
}
}
}
}
}
if(telphone.getFirstChild() != null) {
exportor.log("END:VCARD");
}
}
}
} catch(FileNotFoundException | ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch(IOException e2) {
e2.printStackTrace();
} finally {
exportor.closeLog();
}
}
public void domXMLToCSV(String fileName) {
exportor.log("电话号码,时间,短信内容,位置,类型,状态");
try {
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputStream input = new FileInputStream(fileName);
Document doc = domBuilder.parse(input);
Element root = doc.getDocumentElement();
NodeList smsPhones = root.getChildNodes();
StringBuilder sb = new StringBuilder();
String date="",body="",address="",type="";
int smsNum = 0;
if(smsPhones != null) {
logger.debug("短信数量:"+smsPhones.getLength());
for(int i=0, size=smsPhones.getLength(); i < size; i++) {
Node smsphone = smsPhones.item(i);
if(smsphone.getFirstChild() == null) continue;
smsNum++;
for(Node node = smsphone.getFirstChild(); node != null; node = node.getNextSibling()) {
if(node.getNodeType() == Node.ELEMENT_NODE) {
if(node.getNodeName().equals("Address")) {
address = node.getFirstChild().getNodeValue();
logger.debug(address);
}
if(node.getNodeName().equals("Date")) {
date = node.getFirstChild().getNodeValue();
logger.debug(date);
}
if(node.getNodeName().equals("Body")) {
body = node.getFirstChild().getNodeValue();
int loc = body.indexOf("\"");
if(loc >= 0) {
body = body.replaceAll("\"", "\"\"");
logger.debug(body);
} else
logger.debug(body);
}
if(node.getNodeName().equals("Type")) {
type = node.getFirstChild().getNodeValue();
}
}
}
if("1".equals(type)) {//接收短信
sb.append(address);sb.append(",");sb.append(date);
sb.append(",\"");sb.append(body);sb.append("\",收到,短信,NONE");
} else if("2".equals(type)) {//发送短信
sb.append(address);sb.append(",");sb.append(date);
sb.append(",\"");sb.append(body);sb.append("\",发送,短信,完成");
} else
logger.error("错误!");
exportor.log(sb.toString());
sb.delete(0, sb.length());
}
logger.debug("有效短信数量:" + smsNum);
}
} catch(FileNotFoundException | ParserConfigurationException | SAXException e) {
e.printStackTrace();
} catch(IOException e2) {
e2.printStackTrace();
} finally {
exportor.closeLog();
}
}
public static void main(String[] args) {
DomXML xmlTest = new DomXML();
xmlTest.writeToLogFile("E:/smsresult.csv");
// xmlTest.domXMLToVCF("E:/Contact_QQPhoneManager(2015-12-11).xml");//转vcf格式,转后要用Notepad++转为UTF-8无BOM格式文件,才能导入到小米手机联系人中
xmlTest.domXMLToCSV("E:/Sms_QQPhoneManager(2015-12-11).xml");//转csv格式
}
public void writeToLogFile(String logFile) {
File file = new File(logFile);
exportor.logTo(file);
}
public void closeLogFile() {
logger.debug("关闭导出文件。");
exportor.closeLog();
}
}
相关文章推荐
- Azure Public IP DNS域名
- javascript字符串
- zabbix_agentd.conf配置文件详解
- sql 优化
- EM算法学习资料
- JavaEE_Web项目部署经验_Windows环境下
- Debian for armel 进展情况
- R语言简要入门
- MySQL配置安装启动(win7)
- oc-初始化
- MATLAB中cell数组的是是非非
- java学习笔记-设计模式17(迭代器模式)
- 使用@property - 廖雪峰的官方网站
- CreateThread与_beginthreadex到底有什么区别
- 设置窗体
- java之旅
- handler机制
- asp.net简单实现单点登录(SSO)的方法
- Ubuntu 12.04.5 下安装SRILM1.7.1
- 在阿里云的CentOS环境中安装配置MySQL的教程