使用vCard规范用java生成名片二维码扫一扫自动保存联系人到手机

vCard介绍

【使用vCard规范用java生成名片二维码扫一扫自动保存联系人到手机】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(); } } }

    推荐阅读