上篇文章中,我们介绍了如何从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,来实现从电脑导入联系人的功能。
好的,关于联系人信息的导出我们就介绍到这了,有不足的地方,还望大家能指出来。