Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)

首先声明我们通篇用的都是Google开源框架Zxing,要实现的功能有三个 ,生成普通二维码、生成带有中心图片Logo 的二维码,扫描解析二维码,直接上效果图吧

首先我们需要一个这样的 Zxing 的包类似于这样

接下来需要引入资源

1.drawable 中引入图片 navbar.png

2.layout中引入camera.xml、main.xml、qrcode_capture_page.xml

3.创建raw文件夹并添加beep.ogg 扫描声音

4.合并color.xml,copy ids.xml到values目录中

引入文件之后的效果图是这样的

接下来是 QRCodeUtil 类

package com.chinasie.barcodescanplugin;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
/**
 * Created by HanWeijia on 2017/2/4.
 */
public class QRCodeUtil {
 private static int QR_WIDTH = 300;
 private static int QR_HEIGHT = 300;
 /**
 * 生成二维码Bitmap
 *
 * @param content 内容
 * @param widthPix 图片宽度
 * @param heightPix 图片高度
 * @param logoBm 二维码中心的Logo图标(可以为null)
 * @param filePath 用于存储二维码图片的文件路径
 * @return 生成二维码及保存文件是否成功
 */
 public static Bitmap createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm, String filePath) {
 try {
  if (content == null || "".equals(content)) {
  return null;
  }
  //配置参数
  Map<EncodeHintType, Object> hints = new HashMap<>();
  hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
  //容错级别
  hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  //设置空白边距的宽度
  //  hints.put(EncodeHintType.MARGIN, 2); //default is 4
  // 图像数据转换,使用了矩阵转换
  BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);
  int[] pixels = new int[widthPix * heightPix];
  // 下面这里按照二维码的算法,逐个生成二维码的图片,
  // 两个for循环是图片横列扫描的结果
  for (int y = 0; y < heightPix; y++) {
  for (int x = 0; x < widthPix; x++) {
   if (bitMatrix.get(x, y)) {
   pixels[y * widthPix + x] = 0xff000000;
   } else {
   pixels[y * widthPix + x] = 0xffffffff;
   }
  }
  }
  // 生成二维码图片的格式,使用ARGB_8888
  Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
  bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);
  if (logoBm != null) {
  bitmap = addLogo(bitmap, logoBm);
  }
  //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!
  return bitmap;//!= null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath));
 } catch (WriterException e) {
  e.printStackTrace();
 }
 return null;
 }
 /**
 * 在二维码中间添加Logo图案
 */
 private static Bitmap addLogo(Bitmap src, Bitmap logo) {
 if (src == null) {
  return null;
 }
 if (logo == null) {
  return src;
 }
 //获取图片的宽高
 int srcWidth = src.getWidth();
 int srcHeight = src.getHeight();
 int logoWidth = logo.getWidth();
 int logoHeight = logo.getHeight();
 if (srcWidth == 0 || srcHeight == 0) {
  return null;
 }
 if (logoWidth == 0 || logoHeight == 0) {
  return src;
 }
 //logo大小为二维码整体大小的1/5
 float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;
 Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
 try {
  Canvas canvas = new Canvas(bitmap);
  canvas.drawBitmap(src, 0, 0, null);
  canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
  canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);
  canvas.save(Canvas.ALL_SAVE_FLAG);
  canvas.restore();
 } catch (Exception e) {
  bitmap = null;
  e.getStackTrace();
 }
 return bitmap;
 }
 /**
 * 生成普通的二维码
 * 要转换的地址或字符串,可以是中文
 * @param url
 */
 public static Bitmap createQRImage(String url)
 {
 try
 {
  //判断URL合法性
  if (url == null || "".equals(url) || url.length() < 1)
  {
  return null;
  }
  Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
  hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
  //图像数据转换,使用了矩阵转换
  BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
  int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
  //下面这里按照二维码的算法,逐个生成二维码的图片,
  //两个for循环是图片横列扫描的结果
  for (int y = 0; y < QR_HEIGHT; y++)
  {
  for (int x = 0; x < QR_WIDTH; x++)
  {
   if (bitMatrix.get(x, y))
   {
   pixels[y * QR_WIDTH + x] = 0xff000000;
   }
   else
   {
   pixels[y * QR_WIDTH + x] = 0xffffffff;
   }
  }
  }
  //生成二维码图片的格式,使用ARGB_8888
  Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
  bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
  return bitmap;
 }
 catch (WriterException e)
 {
  e.printStackTrace();
 }
 return null;
 }
}

注释已经很明了了 ,这个工具类我就不多说了,就下来说说调用,当然也很简单

package com.chinasie.barcodescanplugin;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import com.zxing.activity.CaptureActivity;
import java.io.File;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 private static String TAB = MainActivity.class.getSimpleName();
 //显示扫描结果
 private EditText editText = null;
 //扫描按钮
 private Button btnScan = null;
 //普通图片
 private ImageView imageNormal = null;
 //普通按钮
 private Button buttonNormal = null;
 //特按钮
 private Button buttonAndCenter = null;
 //有中心图片
 private ImageView imageWithCenter = null;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 initView();
 }
 /**
 * 点击时间响应
 * @param v
 */
 @Override
 public void onClick(View v) {
 switch (v.getId()){
  case R.id.btnScan:
  try {
   //打开扫描界面扫描条形码或二维码
   Intent openCameraIntent = new Intent(MainActivity.this, CaptureActivity.class);
   startActivityForResult(openCameraIntent, 0);
  }
  catch (Exception ex){
   Log.e(TAB,ex.getMessage());
   ex.printStackTrace();
  }
  break;
  case R.id.button:
  //普通的二维码图片显示到一个ImageView上面
  imageNormal.setImageBitmap(QRCodeUtil.createQRImage("123456789"));
  break;
  case R.id.buttonAndCenter:
  final String filePath = File.separator
   + "qr_" + System.currentTimeMillis() + ".jpg";
  //二维码图片较大时,生成图片、保存文件的时间可能较长,因此放在新线程中
  new Thread(new Runnable() {
   @Override
   public void run() {
   final Bitmap success = QRCodeUtil.createQRImage("strUrl", 800,800,BitmapFactory.decodeResource(getResources(), R.drawable.gg),filePath);
   if (success!=null) {
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
     //带有中心图片的二维码显示在 imageWithCenter 上
     imageWithCenter.setImageBitmap(success);
    }
    });
   }
   }
  }).start();
  break;
 }
 }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 //处理扫描结果(在界面上显示)
 if (resultCode == RESULT_OK) {
  Bundle bundle = data.getExtras();
  String scanResult = bundle.getString("result");
  editText.setText(scanResult);
 }
 }
 /**
 * 初始化View
 */
 private void initView(){
 editText = (EditText)this.findViewById(R.id.editText);
 imageWithCenter = (ImageView)findViewById(R.id.imageAndCenter);
 imageNormal = (ImageView)this.findViewById(R.id.image) ;
 btnScan = (Button)this.findViewById(R.id.btnScan);
 buttonNormal = (Button)this.findViewById(R.id.button);
 buttonAndCenter = (Button)findViewById(R.id.buttonAndCenter);
 btnScan.setOnClickListener(this);
 buttonNormal.setOnClickListener(this);
 buttonAndCenter.setOnClickListener(this);
 }
} 

这里也不过多说了,淡然如果有找不到上述资源的可以下载我的源代码,里面都有。。

点击下载源码

以上所述是小编给大家介绍的Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android基于google Zxing实现各类二维码扫描效果

    随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码扫描我们使用的是google的开源框架Zxing,我们可以去http://code.google.com/p/zxing/下载源码和Jar包,之前我项目中的二维码扫描功能只实现了扫描功能,其UI真的是其丑无比,一个好的应用软件,其UI界面也要被大众所接纳,不然人家就不会用你的软件啦,所以说应用软件功能和界面一样都很重要,例如微信,相信微信UI被很多应用软件所模仿,我也仿照微信扫描二维码效果进行模仿,虽然

  • Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果(推荐)

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心. 随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码

  • Android平台生成二维码并实现扫描 & 识别功能

    1.二维码的前世今生 "二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构成计算机内部逻辑基础的"0"."1"比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集:每个字符占有一定的宽度:具有一定的校验功能

  • Android-Zxing实现二维码的扫描与生成

    Zxing: Zxing是一个开放源码,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.可以实现使用手机内置摄像头完成条形码的扫描以及解码. github: https://github.com/zxing/zxing 首先在写项目的时候,我们需要导入一个moduel,主要是从Zxing中提取的主要功能代码.其地址是: http://pan.baidu.com/s/1sk9pGmT 扫描二维码: 在点击扫描二维码的页面: startActivityForResu

  • Android基于zxing的二维码(网格)扫描 仿支付宝网格扫描

    前言:对于二维码扫描我们使用的是开源框架Zxing或者Zbar,这里使用基于zxing的二维码扫描,类似支付宝网格扫描. 二维码原理介绍: 二维码是用某种特定的几何图形按一定的规律在平面上分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙的利用构成计算机内部逻辑基础的0/1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读以实现信息自动处理:二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息. 效果: 真机

  • Android开发实现模仿360二维码扫描功能实例详解

    本文实例讲述了Android开发实现模仿360二维码扫描功能的方法.分享给大家供大家参考,具体如下: 一.效果图: 二.框架搭建 1.首先,下载最新zxing开源项目. 下载地址:http://code.google.com/p/zxing/ 或 点击此处本站下载. 2.分析项目结构,明确扫描框架需求.在zxing中,有很多其他的功能,项目结构比较复杂:针对二维码QRCode扫描,我们需要几个包: (1)com.google.zxing.client.android.Camera 基于Camer

  • Android实现二维码扫描和生成的简单方法

    这里简单介绍一下ZXing库.ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码.该项目可实现的条形码编码和解码.目前支持以下格式:UPC-A,UPC-E.EAN-8,EAN-13.39码.93码.ZXing是个很经典的条码/二维码识别的开源类库,以前在功能机上,就有开发者使用J2ME运用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力. ZXing

  • Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题

    先给大家展示下效果图: 扫描内容是下面这张,二维码是用zxing库生成的 由于改了好几个类,还是去年的事都忘得差不多了,所以只能上这个类的代码了,主要就是改了这个CaptureActivity.java package com.zxing.activity; import java.io.IOException; import java.util.Vector; import android.app.Activity; import android.content.Intent; import

  • Android实现二维码扫描并登陆网页

    之前写过一个二维码扫描demo,用的Zxing的框架,点击下载,后续扫描二维码中出现一些问题,比如解决压缩图片,调整扫描窗口大小等等.后续单位要求做扫描登录实现,发现难点就是怎么知道你扫描的是这台电脑,后台必须获取到(后台技术的问题)然后把这个参数给我,再传递到后台,后台判断登录即可.这样自己扫描后直接传递个参数就可以实现登录了. 效果如下: 大概代码实现:扫描跳转: //扫描登录a case R.id.tv_more_qr: if (PventQuickClick.isFastDoubleCl

  • Android利用ZXing扫描二维码的实例代码解析

    相关阅读: Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题 此项目源码地址:请点击这里 看一下zxing的项目结构,我这里直接拿过来用的 看一下扫码的activity: package com.fanyafeng.barcode.activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle

  • Android中的二维码生成与扫描功能

    0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维码生成和扫描的功能. 1.    Zxing的使用 从github上下载项目后,可以看到整体代码结构如下: 我们只需将Zxing包下的所有代码copy一份到我们的项目中去,除了这些还需要zxing的jar包,最后相应的资源文件,包括values文件下的ids文件.raw文件中的资源文件(可以替换).

  • Android实现基于ZXing快速集成二维码扫描功能

    二维码扫描现在是一直比较多的应用场景,android的开源项目ZXing提供了完整.成熟的解决方案,如果仅仅是出于快速开发的目的,可以根据自己的项目需要,把ZXing官方提供的项目稍加裁剪,就可以快速的集成到自己的项目中.下面详细演示和介绍如何实现基于ZXing官方提供的源码,快速集成二维码扫描功能到自己项目中的解决方案. (第1步):到ZXing官方主页下载最新的项目代码包,ZXing在github的官方主页:https://github.com/zxing,下载后解压.解压后根目录下有若干项

随机推荐