您的位置:首页 > 移动开发 > IOS开发

使用Cardme读取安卓IOS导出的vcf格式通讯录

2015-09-07 15:18 791 查看

1.先看此贴,了解cardme工具

cardme包部分知识扩充链接地址:使用cardme读写VCard文件,实现批量导入导出电话簿

2.首先准备jar包

我已经打包到百度云网盘,里面有源码和jar包,需要的可以下载:

链接:http://pan.baidu.com/s/1mgGOiHa 密码:n6bk

官方下载地址,最新的是0.4.0版本:cardme

3.更改net.sourceforge.cardme.engine.VCardEngine类,避免读取汉字出现乱码

在此我花了将近一天的时间,来解决乱码问题,在此类中方法getContentFromFile(File vcardFile)中有一个语句,是按照utf-8的编码来操作vcf文件的,我用工具(360手机助手)导出的vcf文件编码是gb2312的,因此在此读入字符流后,编码格式不一致,出现乱码。

接下来修改源码。什么源码不能修改???那你可以在你的工程里新建一个包名一模一样的(net.sourceforge.cardme.engine),然后新建一个VCardEngine类,把源码复制粘贴过去,这时就可以随意更改了。

我们知道类加载的时候是先找自定义的类,如果找不到才去加载你引入的类。

net.sourceforge.cardme.engine.VCardEngine本来的源码是:

private String getContentFromFile(File vcardFile) throws IOException
{
return getContent(new InputStreamReader(new FileInputStream(vcardFile), Charset.forName("UTF-8")));
}


更改后的源码是:

BufferedInputStream bin = new BufferedInputStream(
new FileInputStream(vcardFile));
int p = (bin.read() << 8) + bin.read();
String code = null;
switch (p) {
case 0xefbb:
code = "UTF-8";
break;
case 0xfffe:
code = "Unicode";
break;
case 0xfeff:
code = "UTF-16BE";
break;
default:
code = "GBK";
}
InputStreamReader isr = new InputStreamReader(new FileInputStream(vcardFile), Charset.forName(code));
return getContent(isr);


p是为了识别该编码是,然后按对应编码进行读取文件。

4.读取vcf文件

import java.io.File;
import java.io.IOException;
import java.util.List;

import net.sourceforge.cardme.engine.VCardEngine;
import net.sourceforge.cardme.vcard.VCard;
import net.sourceforge.cardme.vcard.exceptions.VCardParseException;
import net.sourceforge.cardme.vcard.types.NType;
import net.sourceforge.cardme.vcard.types.TelType;
public class ReadVCFFile {
public static void main(String args[]){
String filePath = "F://contact.vcf";
File file = new File(filePath);
VCardEngine vce = new VCardEngine();//new一个vcard引擎
try {
/*
* 一个vcf文件中的联系人不止有一个,我们使用parseMultiple来
* 操作文件,如果只有一个的话 ,使用parse(file)即可。
* 一个联系人对应一个VCard对象;我们读的vcf文件有多个联系人,因此
* 用List来存储。
*
* */
List<VCard> vcards = vce.parseMultiple(file);
for (VCard vCard : vcards) {
NType nt = vCard.getN();//其中姓名等信息存储在NType对象中
String fname= "姓名:";
String gname = "";
if (nt!=null) {
/*我们知道外国的姓名是FamilyName+GivenName
* 在我们中文名,也可以用此来记录姓名。看你的联系
* 人是怎么存储的啦!
*/
fname = fname+nt.getFamilyName();
gname = nt.getGivenName();
}
//为什么用list存储每个人的联系电话,因为我们知道通讯录里
//可以记录多个联系电话。
List<TelType> teltype = vCard.getTels();
System.out.println(fname);

/*某些用户就是不让人省心,只写联系人姓名,不填电话号码
* 真是的,我们只能来个判断了。
*/
if (teltype!=null&&teltype.size()!=0) {
for (TelType telType2 : teltype) {
//循环打印出该联系人的联系电话;
System.out.println(telType2.getTelephone());
}
}

}
} catch (IOException e) {
e.printStackTrace();
} catch (VCardParseException e) {
e.printStackTrace();
}
}
}


好啦!祝您好运!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 通讯录 cardme vcf