1. 程式人生 > >Atitit Java製作VCARD vcf 以上就是關於vCard的基本介紹,維基百科(英文)https://en.wikipedia.org/wiki/VCard寫的比較全,可惜我看不懂。

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