当前位置: 首页 > 工具软件 > cardme > 使用案例 >

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

鲍驰
2023-12-01

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();
    }
}
}

好啦!祝您好运!

 类似资料: