上一篇文章中我们实现了从系统的联系人数据库中获取联系人信息。文章链接:http://blog.csdn.net/github_36878269/article/details/73826289
但是技术总监又提出了新的需求,用户想从文件中导入联系人信息,比如从华为手机助手中导出的联系人文件。在网上查找了许多的答案,有使用第三方的jar包的,比如什么我也忘了,很是坑爹。所以索性就自己分析导出的文件,从流中读取数据。
在实体机上使用系统联系人应用新建几个联系人,连接电脑,使用华为手机助手导出联系人。
1.导出为CSV格式。
导出的文件内容为:
耐心的去分析其中数据表达的信息,该文件在windows上提示为”逗号分隔值文件”,是由引号,引号中的内容和逗号组成的。第一行为联系人信息字段,从第二行开始,每一行代表一个联系人信息,其中每一个”“中的内容为第一行字段对应的数据。比如第二行中的”张三”对应第一行中的”Given Name”,即用户姓名。
根据这个文件格式我们可以从中获取我们想要的信息。下边是我的实现代码。
//fileExtend为选中文件的地址后缀。
if(fileExtend.equals("csv")){
//处理CSV格式数据。
EntityContact contact = null;
try {
while((buffer = reader.readLine()) != null){
if(buffer.startsWith("\"")){
contact = new EntityContact();
//联系人信息行,从中选择我们想要的信息。
String [] infos = buffer.split(",");
contact.setName(nullChange(infos[1])); //联系人姓名。
contact.setMobile_num(nullChange(infos[5])); //联系人手机号。
contact.setHome_num(nullChange(infos[6]));//家用电话。
contact.setOffice_num(nullChange(infos[7]));//工作电话。
contact.setEmail(nullChange(infos[13]));//Email。
contact.setHome_address(nullChange(infos[17]));//家庭住址。
contact.setOffice_address(nullChange(infos[18]));//工作地址
contact.setExtend(nullChange(infos[31]));//备注。
contacts.add(contact);//放入集合。
}
}
} catch (Exception e) {
//数据格式有问题。
contacts = null;
}
}
private static String nullChange(String data){
return (data.equals("") ? null : data.replace("\"", ""));
}
我们就可以从contacts这个链表中获取文件中的联系人信息了。csv格式中不存放联系人的头像信息,所以我们就无法从中获取联系人的头像信息。但vcf格式的可以。
2.vcf格式。
还是分析从华为手机助手导出的联系人文件(.vcf)。
这种格式和csv格式不同,一条联系人数据占用很多行,以”BEGIN:VCARD”为开始,以”END:VCARD”为结束,其中的每行数据代表联系人中的一条信息。如TEL;CELL:13966665555为联系人 ”lisi” 的电话号码。根据这个尿性,我们可以写出如下代码:
//fileExtend为选中文件的地址后缀。
if(fileExtend.equals("vcf")){
//处理VCF格式数据。
EntityContact contact = null;
while((buffer = reader.readLine()) != null){
if(buffer.equals("BEGIN:VCARD")){
//开始标识符。
contact = new EntityContact();
} else if(buffer.startsWith("N:;")){
//名字。
buffer = buffer.substring(buffer.indexOf(";") + 1, buffer.lastIndexOf(";;;"));
contact.setName(buffer);
} else if(buffer.startsWith("TEL;CELL")){
//手机号。
buffer = buffer.substring(buffer.indexOf(":") + 1);
contact.setMobile_num(buffer);
} else if(buffer.startsWith("TEL;WORK;VOICE:")){
//工作号码。
buffer = buffer.substring(buffer.indexOf(":") + 1);
contact.setOffice_num(buffer);
} else if(buffer.startsWith("TEL;HOME;VOICE:")){
//家用号码。
buffer = buffer.substring(buffer.indexOf(":") + 1);
contact.setHome_num(buffer);
} else if(buffer.startsWith("EMAIL;HOME:")){
buffer = buffer.substring(buffer.indexOf(":") + 1);
contact.setEmail(buffer);
} else if(buffer.startsWith("ADR;HOME:")){
buffer = buffer.substring(buffer.indexOf(":") + 1, buffer.lastIndexOf(";;;;;;"));
contact.setHome_address(buffer);
} else if(buffer.startsWith("ADR;WORK:")){
buffer = buffer.substring(buffer.indexOf(":") + 1, buffer.lastIndexOf(";;;;;;"));
contact.setOffice_address(buffer);
} else if(buffer.startsWith("NOTE;WORK:")){
buffer = buffer.substring(buffer.indexOf(":") + 1);
contact.setExtend(buffer);
} else if(buffer.startsWith("PHOTO;")){
//头像数据。
buffer = buffer.substring(buffer.indexOf(":") + 1);
contact.setPhoto(buffer);
}else if(buffer.equals("END:VCARD")){
//结束标识符。
contacts.add(contact);
}
}
}
是不是很简单呢?
总结下解决流程:1.从网上查阅资料,无果,最后放弃。2.从导出的文件中,分析数据,得到数据代表的信息,将数据解析获取想要的信息。
如果有不足的地方还请大家指出,谢谢。
下次我还会介绍这两种格式的文件的导出,以及如何获取系统目录(外部存储,USB存储)并获取文件选中的地址。