使用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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统