转载自   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相关推荐

  1. 用JAVA制作小游戏——飞机大战(三)

    本篇博客是对飞机大战游戏项目完整代码的展示 详细代码讲解: 用JAVA制作小游戏--飞机大战(一) 用JAVA制作小游戏--飞机大战(二) 最下方附整个程序的文件下载链接 代码展示 主界面 impor ...

  2. 用JAVA制作小游戏——飞机大战(二)

    本篇博客是对飞机大战游戏使用代码的展示 重难点: 首先需要鼠标能够控制战机,使鼠标在窗口内时始终能够使战机的位置与鼠标相同,实现鼠标控制战斗机移动. 其次需要能够以一定的速度产生子弹和敌机,并且以一定 ...

  3. 用JAVA制作小游戏——推箱子(三)

    本篇博客主要是对推箱子地图编辑器功能的代码讲解. 首先给出这段代码的部分运行截图: 重难点: 地图编辑器主要有三个重难点: 需要有一个绘制地图的界面 能够实现地图绘制的功能 地图绘制完成后需要将地图内 ...

  4. 用JAVA制作小游戏——推箱子(二)

    本篇博客主要是推箱子游戏界面功能的代码讲解. 首先先给出这段代码的部分运行截图: 重难点: 游戏界面主要有五个重难点: 固定好地图的位置 地图的显示 构建菜单栏 读取地图数据 玩家操作功能实现 地图的 ...

  5. 用JAVA制作小游戏——推箱子(一)

    本篇博客是对推箱子游戏首页代码的展示 效果图: 难点: 在背景图上添加按钮. 由于直接使用add方法,会变成图片一块区域,按钮一块区域,彼此互不重叠,形成的界面效果不太好,因此用了JLayeredPa ...

  6. 使用Java制作验证码

    验证码介绍 验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and Humans Apart& ...

  7. Java制作PDF转图片小工具

    背景: 前几日一位朋友突然找我帮忙将PDF转换成图片,我仗义相助,建议他使用福昕阅读器,然而他说转换需要VIP会员,老贵了.我花了半天时间寻找免费会员,结果不出所料没有找到,我一怒之下,便决定亲自动手 ...

  8. 用JAVA制作抓老鹰游戏_Java制作最难练手速游戏,Faker都坚持不了一分钟

    原标题:Java制作最难练手速游戏,Faker都坚持不了一分钟 想练手速,来啊,互相伤害啊 Java制作最难练手速游戏,目测Faker也坚持不了一分钟 制作思路:只靠Java实现.Java.Java. ...

  9. JAVA 制作给定时间倒计时器

    Java 制作给定时间的倒计时器 首先创建倒计时器类 public class NSTimer {private int hh; //小时private int mm; //分钟private int ...

最新文章

  1. 2018 Wannafly summer camp Day3--Knight
  2. c++Interpolation search插值搜索的实现算法之二(附完整源码)
  3. Linux编译安装Python3
  4. Eclipse中看java源代码
  5. System.getProperty(user.dir); 获得系统属性
  6. javascript中es6语法
  7. java hibernate方言_java – 如何在运行时获取Hibernate方言
  8. js 的强制 类型 转换cast, 伪对象?
  9. 如何彻底卸载VMware
  10. 逻辑题(持续更新中)
  11. 华硕服务器怎么装win7系统教程,华硕win7系统重装教程
  12. 拯救行动 OpenJ_Bailian - 4116
  13. C语言系列(11)——数组(02)
  14. Win10 输入法v模式
  15. 宫崎骏魔幻动画电影《哈尔的移动城堡》高清720P,国粤日三语
  16. ffmpeg mp4和yuv互转
  17. vue3实现吸顶效果
  18. ubuntu14.04的自带的拼音输入法问题
  19. 融金所孙明达:“科技+政策”双轮驱动普惠金融
  20. Centos7 内存插槽信息

热门文章

  1. leedcode05 找出缺失的观测数据(思路加详解)
  2. python编程中的小问题汇总
  3. 幂等问题 vs 如何判断是否是4的幂
  4. hash table(开放寻址法-双重散列实现的哈希表)
  5. 算法-计算逆序对个数
  6. SQL(五) - 表的创建以及操作
  7. 高级数据结构---并查集
  8. matlab光盘映像文件可以删除吗_DVD-Cloner 2020 for mac(DVD光盘刻录工具) 7.00.715
  9. kettle同步数据中文乱码问题解决
  10. P3338 [ZJOI2014]力 FFT + 推式子