Atitit Java制作VCARD vcf 以上就是关于vCard的基本介绍,维基百科(英文)https://en.wikipedia.org/wiki/VCard写的比较全,可惜我看不懂。

Atitit Java制作VCARD   vcf

 

 

以上就是关于vCard的基本介绍,维基百科(英文)https://en.wikipedia.org/wiki/VCard写的比较全,可惜我看不懂。关于vCard格式介绍的文章网上也有很多,我就不再一一阐述。但是关于Java操作vCard的例子却不是很多了,有些也就是自己单单写的一个解析类,于是我漫游网络,最终找到了ez-vcard,我不知道还有没有别的库能操作vCard的,肯定有,但是我也懒得去找了,反正这个可以用就行了。╮( ̄▽ ̄)╭


ez-vcard: 

github主页:https://github.com/mangstadt/ez-vcard

 

下载地址:https://github.com/mangstadt/ez-vcard/wiki/Downloads

 

API文档:http://mangstadt.github.io/ez-vcard/javadocs/latest/index.html

 

参考资料:https://github.com/mangstadt/ez-vcard/wiki

 

 

然后开始编写createVCard(Properties);

 

首先new一个VCard实体类


VCard vcard = new VCard(); 

以Email为例,添加属性

 

新建email,添加内容


Email email = new Email(properties.getProperty("vcard.email")); 

添加Email的类别为INTERNET,关于类别,可以去查看vCard规范


email.getTypes().add(EmailType.INTERNET); 

当添加多个邮箱后,可以设置优先级


email.setPref(1); 

vcard.addEmail(email); 

 

 

其他属性基本类似,具体可以查看官方API,值得一提的是PHOTO使用的是图片的base64,我们可以直接使用以下方式进行添加

 

package vcfvcardprj;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.nio.charset.Charset;

import java.nio.charset.CharsetDecoder;

import java.nio.charset.CharsetEncoder;

import java.util.List;

 

import com.csvreader.CsvReader;

import com.google.common.base.Joiner;

import com.google.common.collect.Lists;

 

import ezvcard.Ezvcard;

import ezvcard.VCard;

import ezvcard.VCardVersion;

import ezvcard.parameter.TelephoneType;

import ezvcard.property.Nickname;

 

public class vcfVcardDemo {

 

public static void main(String[] args) throws IOException {

 

String filePath="C:\\Users\\Administrator\\Desktop\\telbook.txt";

  // 创建CSV读对象

//  new CsvReader

        CsvReader csvReader = new CsvReader(  new FileInputStream(new File(filePath)) , Charset.forName("utf8"));

 

        List li=Lists.newArrayList();

        // 读表头

      //  csvReader.readHeaders();

        while (csvReader.readRecord()){

            // 读一整行

            System.out.println(csvReader.getRawRecord());

            // 读这行的某一列

            System.out.println(csvReader.get(0));

      //      System.out.println(csvReader.get("Link"));

            VCard vcard = new VCard(); 

            vcard.setFormattedName(csvReader.get(1));

            vcard.addTelephoneNumber(csvReader.get(0), TelephoneType.CELL);

   //         vcard.addNickname( new Nickname().set csvReader.get(1));

         

          String str = Ezvcard.write(vcard).version(VCardVersion.V3_0).go();

          li.add(str);

        }

        

        String s=Joiner.on("\r\n").join(li);

 System.out.println(s);

 

}

}

 

 

 

Photo photo = new Photo(new File("D://photo.jpg"), ImageType.JPEG); 

关于自定义属性

VCardProperty QQ = new RawProperty("X-QQ", properties.getProperty("vcard.qq")); 

vcard.addProperty(QQ); 

所有属性添加完成后,编写main方法

public static void main(String[] args) { VCardUtil vCardUtil = new VCardUtil(); VCard vCard = vCardUtil.createVCard(vCardUtil.getProperties()); String s = Ezvcard.write(vCard).version(VCardVersion.V4_0).go(); System.out.println(s); } 

添加getStringVCard() 测试

/**

* 获取字符串形式的vcard

* @param vCard vcard

* @return

*/ public String getStringVCard(VCard vCard){ CharArrayWriter charArrayWriter = new CharArrayWriter(); VCardWriter vCardWriter = null; try { //定义vcard输出流

vCardWriter = new VCardWriter(charArrayWriter,VCardVersion.V3_0); //设置每行的长度,null为不限制

vCardWriter.getRawWriter().getFoldedLineWriter().setLineLength(null); //讲vCard写到输出流里面

vCardWriter.write(vCard); } catch (IOException e) { 

e.printStackTrace(); }finally { if (vCardWriter != null) try { 

vCardWriter.close(); } catch (IOException e) { 

e.printStackTrace(); } } return charArrayWriter.toString(); } 

 

官方也给出了输出到File的例子,和一些设置信息

 

Example:

VCard vcard1 = ... VCard vcard2 = ... File file = new File("vcard.vcf"); VCardWriter writer = null; try { 

writer = new VCardWriter(file, VCardVersion.V3_0); 

writer.write(vcard1); 

writer.write(vcard2); } finally { if (writer != null) writer.close(); } Changing the line folding settings:

 

VCardWriter writer = new VCardWriter(...);//disable line folding

writer.getRawWriter().getFoldedLineWriter().setLineLength(null);//change line length

writer.getRawWriter().getFoldedLineWriter().setLineLength(50);//change folded line indent string

writer.getRawWriter().getFoldedLineWriter().setIndent("/t");//change newline character

writer.getRawWriter().getFoldedLineWriter().setNewline("**"); 

后记: 

目前可能部分手机不支持4.0格式的vCard,比如猴米就只支持3.0格式的

 

小米手机关于3.0版本头像支持问题

 

3.0版本的PHOTO格式为:


PHOTO;ENCODING=b;TYPE=jpeg:…… 

维基百科上写的也是ENCODING=b

 

 

 

猜你喜欢

转载自blog.csdn.net/attilax/article/details/83478489