您的位置:首页 > 其它

三星手机联系人记录导入到小米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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: