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

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:[email protected]
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:[email protected]
            // 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:[email protected]\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();
        }
    }
}

你可能感兴趣的:(使用vCard规范用java生成名片二维码扫一扫自动保存联系人到手机)