将联系人信息导出为CSV和VCF格式文件

  上篇文章中,我们介绍了如何从csv和vcf格式的文件中获取联系人信息。链接:http://blog.csdn.net/github_36878269/article/details/76696685
这次我们反着来,将联系人信息导出为这两种格式的文件。上篇文章中我们已经介绍了这两种格式文件,不再赘述。直接贴代码。
  1.导出为vcf格式。

try{
public static void exportAsVCF(List<EntityContact> contacts){
    try{
        //导出到指定文件夹。
        String path = Environment.getExternalStorageDirectory() + "/test/VCFContacts.vcf";  
        OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(path), "UTF-8");
        //将数据写入到文件中。
        for(EntityContact contact : contacts){
            writer.write("BEGIN:VCARD\r\n");
            writer.write("VERSION:3.0\r\n");

            if(contact.getName() != null){
                writer.write("N:;" + contact.getName() + ";;;\r\n");
            }
            if(contact.getMobile_num() != null){
                writer.write("TEL;CELL:" + contact.getMobile_num() + "\r\n");
            }
            if(contact.getOffice_num() != null){
                writer.write("TEL;WORK;VOICE:" + contact.getOffice_num() + "\r\n");
            }
            if(contact.getHome_num() != null){
                writer.write("TEL;HOME;VOICE:" + contact.getHome_num() + "\r\n");
            }
            if(contact.getEmail() != null){
                writer.write("EMAIL;HOME:" + contact.getEmail() + "\r\n");
            }
            if(contact.getHome_address() != null){
                writer.write("ADR;HOME:" + contact.getHome_address() + ";;;;;;\r\n");
            }
            if(contact.getOffice_address() != null){
                writer.write("ADR;WORK:" + contact.getOffice_address() + ";;;;;;\r\n");
            }
            if(contact.getExtend() != null){
                writer.write("NOTE;WORK:" + contact.getExtend() + "\r\n");
            }
            //获取图片信息。
            String photo = contact.getPhoto();
            if(photo != null){
                byte [] photoByte = Base64.decode(photo, Base64.NO_WRAP);
                String photoType = null;
                if (photoByte.length >= 3 && photoByte[0] == 'G' && photoByte[1] == 'I' && photoByte[2] == 'F') {
                    photoType = "GIF";
                } else if (photoByte.length >= 4 && photoByte[0] == (byte) 0x89
                        && photoByte[1] == 'P' && photoByte[2] == 'N' && photoByte[3] == 'G') {
                    photoType = "PNG";
                } else if (photoByte.length >= 2 && photoByte[0] == (byte) 0xff
                        && photoByte[1] == (byte) 0xd8) {
                    photoType = "JPEG";
                } else {
                    photoType = "unknow";
                }
                writer.write("PHOTO;ENCODING=B;TYPE=" + photoType + ":" + photo + "\r\n");
            }
            writer.write("END:VCARD");

            if(contacts.indexOf(contact) != (contacts.size() - 1)){
                writer.write("\r\n");
            }
        }
        writer.flush();
        writer.close();
    } catch (UnsupportedEncodingException e) {  
        e.printStackTrace();  
    } catch (FileNotFoundException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}

上述代码完成了获取链表中的联系人信息,并逐条的写入到内部存储的/test/contactsVCF.vcf文件里。其中EntityContact为自定义的实体类,我只获取了我感兴趣的数据,其中的成员变量都在代码中引用了,就不贴该实体类的代码了。

  2.csv格式的导出。
根据上篇文章所述,我们根据该格式来讲联系人导出,下面是具体代码:

/**
 * 将数据导出为CSV格式的。
 * @param contacts
 */
public static void exportAsCSV(List<EntityContact> contacts){
    String csvPath = Environment.getExternalStorageDirectory() + "/test/CSVContacts.csv";
    OutputStreamWriter csvwriter;
    try {
        csvwriter = new OutputStreamWriter(new FileOutputStream(csvPath), "UTF-8");
        //添加三个字节,使文件为带bom的utf8格式的文件。
        csvwriter.write(new String(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}));
        csvwriter.write("Family Name,Given Name,Additional Name,Prefix Name,Suffix Name,"   + "Mobile Number,Home Number,Office Number,Home Fax,Bussiness Fax,Pager,Other,customize,"   + "Home Email,Work Email,Other Email,customize,Address Home,Address Work,Address Other,"+ "customize,Organization Work,Organization Other,customize,AIM,Windows Live,YAHOO,"  + "SKYPE-USERNAME,OICQ,GOOGLE-TALK,JABBER,Notes,NickName,WebPage,Ptt/DC1,Ptt/DC2");
        for(EntityContact contact : contacts){
            csvwriter.write("\r\n\"\",");
            if(contact.getName() != null){
                csvwriter.write("\"" + contact.getName() + "\",");
            } else {
                csvwriter.write("\"\",");
            }
            csvwriter.write("\"\",\"\",\"\",");
            if(contact.getMobile_num() != null){
                csvwriter.write("\"" + contact.getMobile_num() + "\",");
            } else{
                csvwriter.write("\"\",");
            }
            if(contact.getHome_num() != null){
                csvwriter.write("\"" + contact.getHome_num() + "\",");
            } else{
                csvwriter.write("\"\",");
            }
            if(contact.getOffice_num() != null){
                csvwriter.write("\"" + contact.getOffice_num() + "\",");
            } else{
                csvwriter.write("\"\",");
            }
            csvwriter.write("\"\",\"\",\"\",\"\",\"\",");
            if(contact.getEmail() != null){
                csvwriter.write("\"" + contact.getEmail() + "\",");
            } else{
                csvwriter.write("\"\",");
            }
            csvwriter.write("\"\",\"\",\"\",");
            if(contact.getHome_address() != null){
                csvwriter.write("\"" + contact.getHome_address() + "\",");
            } else{
                csvwriter.write("\"\",");
            }
            if(contact.getOffice_address() != null){
                csvwriter.write("\"" + contact.getOffice_address() + "\",");
            } else{
                csvwriter.write("\"\",");
            }
            csvwriter.write("\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",");
            if(contact.getExtend() != null){
                csvwriter.write("\"" + contact.getExtend() + "\",");
            } else{
                csvwriter.write("\"\",");
            }
            csvwriter.write("\"\",\"\",\"\",\"\"");
        }
        csvwriter.flush();
        csvwriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

  需要说明的是在11行添加的三个byte,为什么要这么做?因为如果不添加这三个byte,也就是默认导出,导出的文件格式为UTF-8无BOM格式,该格式再windows上无法用华为手机助手解析该文件,所以要加上这三个byte,来实现从电脑导入联系人的功能。

好的,关于联系人信息的导出我们就介绍到这了,有不足的地方,还望大家能指出来。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值