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