版权声明:本文为博主原创文章,未经博主credreamer 同意不得转载 违者追究法律责任。

https://blog.csdn.net/lidew521/article/details/24441825

二维码相关---java生成二维码名片,而且自己主动保存到手机通讯录中...

技术qq交流群:JavaDream:251572072

1.首先介绍一个api.
  Zxing是Google提供的关于条码
  (一维码、二维码)的解析工具,提供了二维码的生成与解析的方法,如今我简介一下使用Java利用Zxing生成与解析二维码
2、二维码的生成
   1.1 将Zxing-core.jar 包增加到classpath下。

   1.2 二维码的生成须要借助MatrixToImageWriter类。
     该类是由Google提供的。能够将该类复制到源代码中,这里我将该类的源代码贴上。能够直接使用。
     import com.google.zxing.common.BitMatrix;
 
 import javax.imageio.ImageIO;
 import java.io.File;
 import java.io.OutputStream;
 import java.io.IOException;
 import java.awt.image.BufferedImage;
 
 
 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);
     }
   }
 
 }
 ------------------------------------------------------------------------
 2.以下创建一个javaproject来生成名片
 ------------------------------------------
 项目结构例如以下:
 ErWerMa
/ErWerMa/src
credream
credream.main
/ErWerMa/src/credream/main/CreQcode.java
credream.utils
/ErWerMa/src/credream/utils/MatrixToImageWriter.java
/ErWerMa/src/Zxing-core.jar
-------------------------------------------------------------
package credream.main;
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;

import credream.utils.MatrixToImageWriter;

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:软件project师
// 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:1606841559@qq.com\n" +
    "TEL:12345678912" +
    "TEL;CELL:12345678912" +
    "ADR:山东济南齐鲁软件园\n" +
    "ORG:" +
    "济南\n" +
    "TITLE:软件project师\n" +
    "URL:http://blog.csdn.net/lidew521\n" +
    "NOTE:呼呼測试下吧。。。\n" +
    "END:VCARD";
    String path = "D:/4S";
    
    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();
}
}
}
-----------------------------------------------------------------------
3.搞定了这样就能够了
  用微信扫描后,会自己主动出现保存页面,然后用户能够选择保存到通讯录中
------------------------------------------------------------------
4.分析:
  a.这里有些亲们可能以为,扫描出来是个页面,就以为二维码里存放了一个jsp相似的页面
    事实上这样想是错误的
  b.非常好证明,由于用微信或者qq能够把扫描的内容加到通讯录里,可是用普通的二维码扫描软件是不能够的
    这就说明,事实上二维码中存放的不过一串被格式化了的数据而已,这段数据在上文中有提到
  c.微信之所以能够扫描成联系人的格式,是由于微信内部做了处理,这里处理过程应该是这种
    首先微信会调用二维码api来解析二维码
  d.其次微信会用解析出来的内容填充的实现准备好的jsp页面中,然后,在这个jsp页面中,就存在一段
    能够跟微信程序中java方法,联系的js代码,这样就能够通过微信中的java方法,调用android系统的通讯录了
    (这个部分说的可能不太清楚,android中js和java方法是能够相互调用传值的,大家能够学习下android,通讯录部分,也能够參考下
      我曾经写过的android教程)

二维码相关---java生成二维码名片,而且自己主动保存到手机通讯录中...的更多相关文章

  1. 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...

    http://blog.csdn.net/lidew521/article/details/24441825

  2. 利用JAVA生成二维码

    本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...

  3. java 生成二维码、可带LOGO、可去白边

      1.准备工作 所需jar包: JDK 1.6: commons-codec-1.11.jar core-2.2.jar javase-2.2.jar JDK 1.7: commons-codec- ...

  4. java 生成二维码后叠加LOGO并转换成base64

      1.代码 见文末推荐 2.测试 测试1:生成base64码 public static void main(String[] args) throws Exception { String dat ...

  5. java生成二维码的几个方法

    1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/ ...

  6. 如何使用 Java 生成二维码

    步骤 下载jar包(QRCode.jar) maven项目手动引入jar包 编写实体类实现二维码的生成 controller调用 下载jar包(QRCode.jar) 下载网址如下: QRCode生成 ...

  7. java生成二维码打印到浏览器

    java生成二维码打印到浏览器   解决方法: pom.xml的依赖两个jar包: <!-- https://mvnrepository.com/artifact/com.google.zxin ...

  8. java生成二维码的几种方式

    1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/ ...

  9. (二)一起学 Java Collections Framework 源码之 AbstractCollection

    . . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述(未完成) (二)一起学 Java Collections Framework 源码之 Abs ...

随机推荐

  1. 各种条码的校验码算法(EAN13,COD128,GTIN,UCC等)

    校验码是由编码方案决定的,所以在代码中是否使用校验码和条码基本无关,但商品条码除外.今天给大家介绍几种校验码的计算方法. 一.商品条码: 商品条码中需要计算校验码的有:EAN-8(8位),EAN-13 ...

  2. vue不是内部或外部命令的解决方法

    1.在nodejs的安装目录下,找到vue.cmd,将此路径加到环境变量中,我是通过nvm管理node版本的,路径是C:\Users\hy\AppData\Roaming\nvm\v6.10.0,关闭 ...

  3. 条款7:为多态基类析构函数声明为virtual

    基类指针指向子类对象. 子类对象必须位于堆.因此为了避免泄漏内存资源,当指针不使用时,delete掉每一个对象非常重要.但是如果基类的析构函数不声明为virtual.那么指向子类对象的指针delete ...

  4. python如何获取变量的变量名

    假设现在存在一个值为1变量名为a的变量,如何通过一个函数获取该变量的变量名a? 上面这个需求来源于某群友的一个要求,希望能有一个这样的函数来方便打印. 这个需求很扯淡啊,为什么不用格式化输出?它回复到 ...

  5. hadoop通过java输出HAFS上的文件内容

    package org.apache.hadoop.book;import java.io.InputStream;import java.net.URL;import org.apache.hado ...

  6. JavaSE---多线程---扩展

    1.线程的类型 1.1 用户线程 1.2 内核线程 2.java线程 java线程的创建依赖于系统内核,通过JVM调用系统库创建内核线程: 内核线程与java-Thread是1:1的映射关系: 3.线 ...

  7. macOS系统安装gnuplot(解决Terminal type set to unknown)

    macOS 下使用 Homebrew 安装 gnuplot brew install gnuplot 在 terminal 中输入gnuplot进入模式之后,提示_Terminal type set ...

  8. C++ LinearRegression代码实现

    这里基本完全参考网络资源完成,有疑问欢迎留言! LinearRegression.h #pragma once #ifndef ML_LINEAEEEGRESSION_H #define ML_LIN ...

  9. 【RabbitMQ】使用RabbitMQ实现延迟任务

    场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 上述类似的需求是我们经常会遇见的问题. ...

  10. JS中数据结构之列表

    列表是一组有序的数据.每个列表中的数据项称为元素.在 JavaScript 中,列表中的元素可以是任意数据类型.列表中可以保存多少元素并没有事先限定并可以不断壮大,实际使用时元素的数量受到程序内存的限 ...