使用vCard规范用java生成名片二维码扫一扫自动保存联系人到
2017-12-23 本文已影响0人
我和程序猿的日常
vCard介绍
vCard是电子名片的文件格式标准。它一般附加在电子邮件之后,但也可以用于其它场合(如在互联网上相互交换)。vCard可包含的信息有:姓名、地址资讯、电话号码、URL,logo,相片等。
vCard(或称做Versitcard)最早是由Versit联盟于1995年提出的,当时联盟成员包括苹果公司,AT&T科技(后来的朗讯),IBM及西门子。在1996年十二月,格式的拥有权移至互联网邮件联盟(IMC),此联盟是由一些关注互联网电子邮件的公司所组成。
与vCard一同提出的用于数据交换的标准还有vCalendar,但现在被iCalendar所取代。互联网邮件联盟已经声明它希望“所有的vCalendar开发者利用这些新的开放标准,并使软件能够同时兼容vCalendar 1.0和iCalendar。”
vCard标准的2.1版被电子邮件客户端广泛支持。3.0版是一个包含在RFC 2425和RFC 2426中的IETF标准跟踪提案。vCard的常用副档名是.vcf。
不同的程序对vCard标准实现亦不同。Mac OS X中的Address Book允许把所有联系人导出到一个vcf文件,而Microsoft Outlook只能每人一个文件。Linux中KDE的Kontact允许每个文件导入或导出一人或多人。
vCard文件样例
BEGIN:VCARD
VERSION:2.1
N:Gump;Forrest
FN:Forrest Gump
ORG:Gump Shrimp Co.
TITLE:Shrimp Man
TEL;WORK;VOICE:(111) 555-1212
TEL;HOME;VOICE:(404) 555-1212
EMAIL;PREF;INTERNET:forrestgump@walladalla.com
REV:20080424T195243Z
END:VCARD
java代码生成二维码
- 需要google提供的zxing包生成二维码,提前准备好导入到工程中(com.google.zxing.common.BitMatrix)
MatrixToImageWriter类
import javax.imageio.ImageIO;
import java.io.File;
import java.io.OutputStream;
import java.io.IOException;
import java.awt.image.BufferedImage;
import com.google.zxing.common.BitMatrix;
public final class MatrixToImageWriter {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private MatrixToImageWriter() {
}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, stream)) {
throw new IOException("Could not write an image of format " + format);
}
}
}
CreQcode类
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
public class CreQcode {
public static void main(String[] args) {
try {
// 1.下面是我测试用的一个format
// BEGIN:VCARD
// "VERSION:3.0
// N:李德伟
// EMAIL:1606841559@qq.com
// TEL:12345678912
// TEL;CELL:12345678912
// ADR:山东济南齐鲁软件园
// ORG:济南
// TITLE:软件工程师
// URL:http://blog.csdn.net/lidew521
// NOTE:呼呼测试下吧。。。
// END:VCARD"
// 2.根据测试结果推理
// ---------------------------------------
// 测试结果不加回车是不行的这样的话会出现问题
// 就是扫描出来以后会没有内容
// 这里可以看出,微信解析二维码的方式
// -------------------------------------------------
// 3.测试\n可以被二维码识别
// 这里也是有原因的,因为微信扫描二维码后会进行二次加工,
// 这里加工的时候,是用java代码的,因为是android系统,所以在
// java中的回车是\n,因此这里就要用\n来分割
String content = "BEGIN:VCARD\n" + "VERSION:3.0\n" + "N:张三\n" + "EMAIL:11111@qq.com\n" + "TEL:15100000000\n" + "ADR:\n" + "ORG:\n" + "TITLE:\n" + "URL:\n" + "NOTE:\n" + "END:VCARD";
String path = "D:/";
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400, hints);
File file1 = new File(path, "名片.jpg");
MatrixToImageWriter.writeToFile(bitMatrix, "jpg", file1);
} catch (Exception e) {
e.printStackTrace();
}
}
}