Android 点击生成二维码功能实现代码

先看效果:

输入内容,点击生成二维码:

点击logo图案:

代码:

QRCodeUtil:

package com.example.administrator.zxing;
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.Map;
public class QRCodeUtil {
  public static boolean createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm, String filePath) {
    try {
      if (content == null || "".equals(content)) {
        return false;
      }
      //配置参数
      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 | IOException e) {
      e.printStackTrace();
    }
    return false;
  }
  /**
   * 在二维码中间添加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;
  }
}

MainActivity:

package com.example.administrator.zxing;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import java.io.File;
public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //内容
    final EditText contentET = (EditText) findViewById(R.id.create_qr_content);
    //显示二维码图片
    final ImageView imageView = (ImageView) findViewById(R.id.create_qr_iv);
    //是否添加Logo
    final CheckBox addLogoCB = (CheckBox) findViewById(R.id.create_qr_addLogo);
    Button createQrBtn = (Button) findViewById(R.id.create_qr_btn);
    createQrBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        final String filePath = getFileRoot(MainActivity.this) + File.separator
            + "qr_" + System.currentTimeMillis() + ".jpg";
        //二维码图片较大时,生成图片、保存文件的时间可能较长,因此放在新线程中
        new Thread(new Runnable() {
          @Override
          public void run() {
            boolean success = QRCodeUtil.createQRImage(contentET.getText().toString().trim(), 800, 800,
                addLogoCB.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.qr_logo) : null,
                filePath);
            if (success) {
              runOnUiThread(new Runnable() {
                @Override
                public void run() {
                  imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));
                }
              });
            }
          }
        }).start();
      }
    });
  }
  //文件存储根目录
  private String getFileRoot(Context context) {
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
      File external = context.getExternalFilesDir(null);
      if (external != null) {
        return external.getAbsolutePath();
      }
    }
    return context.getFilesDir().getAbsolutePath();
  }
}

布局:

activity_main:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context="com.example.administrator.zxing.MainActivity">
  <EditText
    android:id="@+id/create_qr_content"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <Button
      android:id="@+id/create_qr_btn"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="生成二维码" />
    <CheckBox
      android:id="@+id/create_qr_addLogo"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="添加logo图案" />
  </LinearLayout>
  <ImageView
    android:id="@+id/create_qr_iv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

总结

以上所述是小编给大家介绍的Android 点击生成二维码功能实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 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生成二维码的经典案例,供大家参考,具体内容如下 1.首先呢,先编译 compile 'com.google.zxing:core:3.2.1' 2.实战 public class QRCode { private static int IMAGE_HALFWIDTH = 50;//宽度值,影响中间图片大小 /** * 生成二维码,默认大小为500*500 * * @return bitmap */ public static Bitmap createQRCode(

  • Android基于google Zxing实现二维码的生成

    最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用,下载了他们的源码后,只做了少少的改动,就是在Demo中增加了长按识别的功能,网上虽然也有长按识别的Demo,但好多下载下来却无法运行,然后总结了一下,加在了下面的Demo中.   下面来介绍这个Demo的主类 public class BarCodeTestActivity extends Activity { priv

  • Android编程实现二维码的生成与解析

    本文实例讲述了Android编程实现二维码的生成与解析.分享给大家供大家参考,具体如下: 直接上代码,代码上面有具体的解析,并且提供jar供下载:二维码Jar包.rar. 根据文本生成对应的二维码: // 生成QR图 private void createImage() { try { // 需要引入core包 QRCodeWriter writer = new QRCodeWriter(); String text = qr_text.getText().toString(); Log.i(T

  • Android 二维码 生成和识别二维码 附源码下载

    今天讲一下目前移动领域很常用的技术--二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件.之前我就想了解二维码是如何工作,最近因为工作需要使用相关技术,所以做了初步了解.今天主要是讲解如何使用ZXing库,生成和识别二维码.这篇文章实用性为主,理论性不会讲解太多,有兴趣可以自己查看源码. 1.ZXing库介绍 这里简单介绍一下ZXing库.ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口

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

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

  • Android 点击生成二维码功能实现代码

    先看效果: 输入内容,点击生成二维码: 点击logo图案: 代码: QRCodeUtil: package com.example.administrator.zxing; import android.graphics.Bitmap; import android.graphics.Canvas; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zx

  • Android扫描和生成二维码

    本文实例为大家分享了Android扫描和生成二维码的具体代码,供大家参考,具体内容如下 MainActivity.java public class MainActivity extends AppCompatActivity { private ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCo

  • Android 二维码扫描和生成二维码功能

    在APP开发中,常遇到二维码扫描功能和生成二维码的需求.Android大部分是集成了zxing这个开源项目的扫码功能. 开源项目地址 下面给大家介绍一下具体的集成步骤 集成步骤 参考demo 1.demo展示如下: 1.1demo首页 1.2扫描界面 可以根据需求修改,我实际项目中界面截图如下: 1.3生成二维码 2.引入文件 2.1 下载demo,拷贝demo中的com.google.zxing5个包和com.utils包引入到自己的项目中. 2.2 拷贝本项目demo中的布局activity

  • Yii2.0实现生成二维码功能实例

    本文实例讲述了Yii2.0实现生成二维码功能.分享给大家供大家参考,具体如下: 通过composer安装: 1.下面的方法是通过composer加载 php composer.phar require "2amigos/yii2-qrcode-helper" "*" 或者添加 "2amigos/yii2-qrcode-helper" : "*" 到对应项目的composer.json文件中 通过归档文件安装: 不习惯用comp

  • 使用JS 插件qrcode.js生成二维码功能

    效果图: qrcode.js这是一个使用比较多的js生成二维码的插件,使用也很方便,第一次用,记录一下使用方法: 首先,导入js,这个网上可以找到,附上地址:https://github.com/davidshimjs/qrcodejs/ jsp: <script type="text/javascript" src="<%=basePath %>bootstrap/js/qrcode.js" charset="UTF-8"&g

  • Android利用zxing生成二维码的过程记录

    目录 二维码生成原理(即工作原理) 效果图如下: 前提: 源码如下: 总结 二维码生成原理(即工作原理) 二维码官方叫版本Version.Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(V-1)*4 + 21(V是版本号) 最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形. 下面是一个二维码的样例: 效果图如下: 前提:

  • C# winform点击生成二维码实例代码

    C# winform 新手实例:点击生成二维码 效果图如下: 打开exe默认界面 部分代码: //button点击事件 private void button1_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(textBox1.Text)) { MessageBox.Show("请输入要生成的二维码!"); return; } GenByZXingNet(textBox1.Text); } //生成二维码图片的函

  • 微信小程序webview实现长按点击识别二维码功能示例

    本文实例讲述了微信小程序webview实现长按点击识别二维码功能.分享给大家供大家参考,具体如下: 场景:微信小程序,使用webview控件.需求:点击图片后长按图片出现"识别二维码" 1.JS代码: <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script type="text/javascript"> $(fu

  • Qt实现字符串生成二维码功能

    目录 前言 开发环境 实现步骤 资源包数据 配置属性 二维码操作 总结 前言 最近在整理开发项目中遇到的知识点,发现了一个特别有意思的功能:使用字符串生成二维码操作. 下面是实现的效果图 开发环境 WIN10环境 + VS2017 + Qt 5.14.2 64位开发环境 实现步骤 资源包数据 说实话我的开发环境还真是挺麻烦的~ 想要使用Qt使用二维码功能,必须要外加 "qrencode"库.针对我目前用的环境使用cmake编译了一个dll库 编译出来的文件包含了两个:lib和src,如

  • 教你如何使用google.zxing结合springboot生成二维码功能

    目录 Zxing原生方式 添加依赖 二维码生成工具类 添加Controller 添加测试页面 Hutool的方式 添加依赖 创建QRCodeService 添加Controller 效果测试 我们使用两种方式,去生成二维码,但是其实,二维码的生成基础,都是zxing包,这是Google开源的一个包,第一种是使用原始的zxing方式去实现,第二种是使用hutool来实现,hutool其实也是对于zxing的一个封装,但是封装前后,确实比较简单了. Zxing原生方式 添加依赖 <!-- zxing

随机推荐