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