Java制作VCARD
轉載自? ?Java制作VCARD
簡介:?
vCard是電子名片的文件格式標準。它一般附加在電子郵件之后,但也可以用于其它場合(如在互聯網上相互交換)。vCard可包含的信息有:姓名、地址資訊、電話號碼、URL,logo,相片等。
——摘自維基百科https://zh.wikipedia.org/wiki/VCard
vCard規范容許公開交換個人數據交換 (Personal Data Interchange PDI) 信息,在傳統紙質商業名片可找到這些信息。規范定義電子名片(或叫vCard)的格式。 vCard 規范可作為各種應用或系統之間的交換格式。定義的格式與傳送的方法無關。傳送交換可能是文件系統,點對點交換的公共電話網絡,以有線網絡或無線傳送的方式。用戶能在互聯網上直接利用vCard。電子郵件能轉發在vCard中人信息。網頁上很多用戶填寫的表格可自動使用vCard。
——摘自百度百科http://baike.baidu.com/view/495045.htm
以上就是關于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
Maven
com.googlecode.ez-vcard?
ez-vcard?
...?
Gradle
compile 'com.googlecode.ez-vcard:ez-vcard:0.9.11'?
ez-vcard可以操作vCard、xCard、jCard、hCard,在這里,我主要介紹vCard的寫操作。
我們首先新建一個項目,我這里使用的是Intellij IDEA創建的Mavenx項目,如果不是Maven項目,也可以直接導入jar包使用
新建vacrd.properties用于模擬數據
vcard.name=張三?
vcard.address=湖北武漢?
aliyunzixun@xxx.com ?
vcard.mobile=182****2658?
vcard.phone=027-49***44?
vcard.fax=49**46?
vcard.org=武漢家里蹲股份有限公司?
vcard.role=軟件開發員?
vcard.title=投研產品事業部?
vcard.url=http://www.whjld.com/san.zhang?
vcard.qq=32*****44?
vcard.weixin=zhangsan?
vcard.weibo=http://weibo.com/zhangsan?
新建VCardUtil.java
編寫getProperties()方法用于讀取資源文件
/** * 讀取資源文件 * @return Properties */ public Properties getProperties(){ //讀取資源文件 InputStream resourceAsStream = this.getClass().getClassLoader() .getResourceAsStream("vcard.properties"); Properties properties = new Properties(); try { //使用字符流,防止中文亂碼 BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(resourceAsStream,"UTF-8")); properties.load(bufferedReader); } catch (IOException e) { e.printStackTrace(); } return properties; }然后開始編寫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中
vcard.addEmail(email);?
其他屬性基本類似,具體可以查看官方API,值得一提的是PHOTO使用的是圖片的base64,我們可以直接使用以下方式進行添加
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); }設置vCard的版本號為4.0,運行結果如下
BEGIN:VCARD?
VERSION:4.0?
PRODID:ez-vcard 0.9.11?
N:;張三;;;?
FN:張三?
ADR;TYPE=dom;TZ=UTC+8:;;湖北武漢;;;;?
EMAIL;TYPE=internet;PREF=1:? aliyunzixun@xxx.com ?
TEL;TYPE=cell:182****2658?
TEL;TYPE=work:027-49***44?
TEL;TYPE=fax:49**46?
ORG:武漢家里蹲股份有限公司?
ROLE:軟件開發員?
TITLE:投研產品事業部?
URL:http://www.whjld.com/san.zhang?
X-QQ:32*****44?
X-WEIXIN:zhangsan?
X-WEIBO:http://weibo.com/zhangsan?
END:VCARD?
上面沒有添加PTOTO,如果添加了PHOTO,你會發現一件奇怪的事,代碼一行過長后會自動換行,并且在第二行會加一個空格,導致文件不能正常使用(如果你們可以正常使用,當我沒說)。
BEGIN:VCARD?
VERSION:4.0?
PRODID:ez-vcard 0.9.11?
N:;張三;;;?
FN:張三?
ADR;TYPE=dom;TZ=UTC+8:;;湖北武漢;;;;?
EMAIL;TYPE=internet;PREF=1:? aliyunzixun@xxx.com ?
TEL;TYPE=cell:182****2658?
TEL;TYPE=work:027-49***44?
TEL;TYPE=fax:49**46?
ORG:武漢家里蹲股份有限公司?
ROLE:軟件開發員?
TITLE:投研產品事業部?
PHOTO:data:image/jpeg;base64,/9j/4RR6RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAA?
EaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAU?
AAAAjodpAAQAAAABAAAApAAAANAADqYAAAAnEAAOpgAAACcQQWRvYmUgUGhvdG9zaG9wIENTNS?
BXaW5kb3dzADIwMTY6MDQ6MDggMTA6MTQ6MDUAAAAAA6ABAAMAAAAB//8AAKACAAQAAAABAAAE?
AKADAAQAAAABAAADAAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAA?
EmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABNEAAAAAAAAAEgAAAABAAAASAAA?
AAH/2P/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ?
8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0Q?
Dg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA?
wM/8AAEQgAeACgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYH?
CAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAw?
QhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX?
0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAA?
ICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M0?
.?
.?
.?
//代碼太長,只截取一部分?
查閱API之后,發現他有專門的 Writer方法,并且可以設置每行的長度,Writer方法可以寫到OutputStream、Writer、File里面,更具情況可以自行選擇。
添加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
華為,蘋果的都可以正常顯示,但是小米手機顯示不了頭像,改成ENCODING=BASE64,就可以顯示了,可能是小米的解析的問題
總結
以上是生活随笔為你收集整理的Java制作VCARD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3万左右组装机配置?
- 下一篇: 3万元电脑配置?