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/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