需要全部代码请点赞关注收藏后评论区留言~~~

一、二维码基本内容介绍

条形码只能表达十几位数字编码,无法表示更复杂的数据。 二维码在二维方格上描出一个个黑点,从而表达更丰富的信息。 二维码早已在手机App中广泛使用,不管是添加好友还是支付收款,只要出示二维码让别人扫一扫,滴的一下便轻松操作完成了

二维码在二维方格上描出一个个黑点,从而表达更丰富的信息,二维码中每个点有是(显示黑点)和否(不显示黑点)两种状态,二维码的左上角、右上角、左下角各有一个带黑框的黑色方块,这三个黑方块用于确定二维码的上下左右方位。因为用户可能斜着扫描,也可能倒过来扫描,通过三个角落的黑色方块便能将二维码旋转至正常方向,另外二维码中间放着公众号的logo图标,并不影响扫描识别,这是因为二维码留出了一定的容错率,即使部分区域被遮盖或者被污损,扫码软件依然能够根据剩余的大部分区域自动纠错,从而解析得到原始的编码信息。

当然,功能如此强悍的二维码可不是随随便便生成的,而要根据特定的算法将一串文本经过编码处理而形成的,若要使用App生成二维码,需要借助谷歌开源的zxing库,在代码中引入二维码撰写器QRCodeWriter,并调用撰写器的encode方法即可生成二维码位图

二、生成自己的二维码

运行测试App效果如下 可在下拉框中选择二维码的不同容错率,对应的二维码形状也会发生变化

代码如下

package com.example.face;import androidx.appcompat.app.AppCompatActivity;import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;import com.example.face.util.BitmapUtil;
import com.example.face.util.DateUtil;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;import java.util.HashMap;
import java.util.Map;public class GenerateQrcodeActivity extends AppCompatActivity {private final static String TAG = "GenerateQrcodeActivity";private EditText et_content; // 声明一个编辑框对象private ImageView iv_qrcode; // 声明一个图像视图对象private Bitmap mBitmap; // 声明一个位图对象private ErrorCorrectionLevel mErrorRate; // 容错率@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_generate_qrcode);et_content = findViewById(R.id.et_content);iv_qrcode = findViewById(R.id.iv_qrcode);findViewById(R.id.btn_generate).setOnClickListener(v -> {String content = et_content.getText().toString();if (TextUtils.isEmpty(content)) {Toast.makeText(this, "请先输入原始文本", Toast.LENGTH_SHORT).show();return;}// 生成原始文本对应的二维码位图mBitmap = createQrcodeBitmap(content, mErrorRate);iv_qrcode.setImageBitmap(mBitmap); // 设置图像视图的位图对象});findViewById(R.id.btn_save).setOnClickListener(v -> {if (mBitmap == null) {Toast.makeText(this, "请先生成二维码图片", Toast.LENGTH_SHORT).show();return;}// 生成图片文件的保存路径String path = String.format("%s/%s.jpg",getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString(),DateUtil.getNowDateTime());BitmapUtil.saveImage(path, mBitmap); // 把位图保存为图片文件BitmapUtil.notifyPhotoAlbum(this, path); // 通知相册来了张新图片Toast.makeText(this, "成功保存二维码图片:" + path, Toast.LENGTH_SHORT).show();});initErrorSpinner(); // 初始化容错率下拉框}// 初始化容错率下拉框private void initErrorSpinner() {ArrayAdapter<String> errorAdapter = new ArrayAdapter<>(this,R.layout.item_select, errorNameArray);Spinner sp_error = findViewById(R.id.sp_error);sp_error.setPrompt("请选择容错率");sp_error.setAdapter(errorAdapter);sp_error.setOnItemSelectedListener(new ErrorSelectedListener());sp_error.setSelection(0);}private String[] errorNameArray = {"30%", "25%", "15%", "7%"};private ErrorCorrectionLevel[] erroLevelArray = {ErrorCorrectionLevel.H,ErrorCorrectionLevel.Q, ErrorCorrectionLevel.M, ErrorCorrectionLevel.L};class ErrorSelectedListener implements AdapterView.OnItemSelectedListener {public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {mErrorRate = erroLevelArray[arg2];}public void onNothingSelected(AdapterView<?> arg0) {}}// 生成原始文本对应的二维码位图private Bitmap createQrcodeBitmap(String content, ErrorCorrectionLevel errorRate) {if (TextUtils.isEmpty(content)) {return null;}int width = content.length()*6; // 二维码图片的宽度int height = width; // 二维码图片的高度int margin = width / 20; // 二维码图片的空白边距Log.d(TAG, "content="+content+",width="+width+",height="+height+",margin="+margin+",errorRate="+errorRate.name());Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.MARGIN, margin); // 设置空白边距hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码格式hints.put(EncodeHintType.ERROR_CORRECTION, errorRate); // 设置容错率try {// 根据配置参数生成位矩阵对象BitMatrix bitMatrix = new QRCodeWriter().encode(content,BarcodeFormat.QR_CODE, width, height, hints);// 创建像素数组,并根据位矩阵对象为数组元素赋色值int[] pixels = new int[width * height];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {if (bitMatrix.get(x, y)) { // 返回true表示黑色色块pixels[y * width + x] = Color.BLACK;} else { // 返回false表示白色色块pixels[y * width + x] = Color.WHITE;}}}// 创建位图对象,并根据像素数组设置每个像素的色值Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, width, 0, 0, width, height);if (bitmap.getWidth() < 300) { // 图片太小的话,要放大图片bitmap = BitmapUtil.getScaleBitmap(bitmap, 300.0/bitmap.getWidth());}return bitmap;} catch (Exception e) {e.printStackTrace();return null;}}
}

创作不易 觉得有帮助请点赞关注收藏~~~

【Android App】二维码的讲解及生成属于自己的二维码实战(附源码和演示 超详细必看)相关推荐

  1. 【Android App】给三维的地球仪贴上动物贴纸实战(附源码和演示 超详细必看)

    需要源码和图片集请点赞关注收藏后评论区留言~~~ 一.纹理贴图 给三维物体穿衣服的动作,通常叫做给三维图形贴图,更专业地说叫纹理渲染. 渲染纹理的过程主要由三大项操作组成,分别说明如下: (1)启用纹 ...

  2. 【Android App】实战项目之仿拼多多的直播带货(附源码和演示 超详细必看)

    需要源码请点赞关注收藏后评论区留言私信~~~ 近年来电商业态发生了不小的改变,传统的电商平台把商品分门别类,配上精美的图文说明供消费者挑选,新潮的电商平台则请来明星网红,开启直播秀向广大粉丝推销商品, ...

  3. 【Android App】实战项目之仿微信的视频通话(附源码和演示 超详细必看)

    需要源码请点赞关注收藏后评论区留言私信~~~ 虽然手机出现许多年了,它具备的功能也越来越丰富,但是最基本的通话功能几乎没有变化.从前使用固定电话的时候,通话就是听声音:如今使用最新的智能手机,通话仍旧 ...

  4. 【Android App】检查手机连接WiFi信息以及扫描周围WiFi的讲解及实战(附源码和演示 超详细必看)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.检查是否连接WiFi以及输出WiFi信息 传统的定位方式不适用于室内的垂直定位,原因如下: (1)卫星定位要求没有障碍物遮挡,它在户外比较精准,在 ...

  5. 黯然微信小程序杂记(二):小程序最新版登录并进行缓存模块的实现 附源码

    黯然微信小程序杂记(二):小程序最新版登录进行缓存模块的实现 附源码 一.功能描述 二.mine.wxml界面图片 三.mine.wxml代码 四.mine.wxss代码 五.mine.js代码 六. ...

  6. 【首次分享】企业级车载系统开发指南+项目实战(附源码)

    前言 Android 现在已经拥有十分成熟的开发体系,成熟也说明了这个系统的带来的开发红利消退了,说通俗点就是可以跳槽岗位少了,随着最近几年小程序和公众号崛起,让app应用需求量断崖式下降.所以现在更 ...

  7. springboot项目文档源码_基于SpringBoot和Vue的企业级中后台项目(附源码)

    简介 SpringBoot和Vue,前后端分离,我们开源一套漂亮的代码和一套整洁的代码规范,让大家在这浮躁的代码世界里感受到一股把代码写好的清流!同时又让开发者节省大量的时间,减少加班,快乐工作,热爱 ...

  8. php万圣节源码,如何使用纯CSS实现万圣节的toggle控件(附源码)

    本篇文章给大家带来的内容是关于如何使用纯CSS实现万圣节的toggle控件(附源码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 效果预览 源代码地址 https://github ...

  9. Django项目实战(附源码免费下载)

    制作图书管理系统(末尾附源码) 第一步先更改settings.py里面的必要配置,更改或附件项如下 INSTALLED_APPS = ['django.contrib.admin','django.c ...

最新文章

  1. Spark2.x写入Elasticsearch的性能测试
  2. 计算机的磁盘地址格式,如何查看电脑硬盘是GPT分区还是MBR分区
  3. C# 之 用NPOI类库操作Excel
  4. html tab选项卡 控件,tab选项卡插件
  5. opencv在linux设置环境变量,linux下设置opencv环境变量
  6. 纸筒制作机器人_趣味STEAM教育:如何用“垃圾”制作机器人?
  7. 安腾机器IA64 全自动网络安装Linux - elilo+kickstart
  8. linux ftp下载geo,GEO数据下载及处理详细过程
  9. DVWA教程(一) —— Low级别
  10. AndRoid studio创建APP图标
  11. 键盘部分失灵/被锁定解决办法
  12. 【算法分析】回溯法解数独(九宫格)算法
  13. 美妆科技:改变美容行业的未来
  14. phpinfo()函数 写法
  15. uni-app页面跳转以及传值
  16. 解决IntelliJ IDEA创建Maven项目没有src目录的问题
  17. matlab计算幅度
  18. CI520与CV520的兼容模式研发资料
  19. 基于ENVI软件进行图像归一化操作
  20. Android平移补间动画,Android 补间动画之平移动画TranslateAnimation

热门文章

  1. 程序员如何轻松又愉快的学好英语
  2. canal mq数据同步
  3. pymysql模块安装后,import pymysql找不到?
  4. 工控系统的全球安全现状:全球漏洞实例分析
  5. Hololens单击、双击
  6. java -Djava.ext.dirs= -jar 启动项目,产生的问题
  7. 2021综述:一般目标检测中的遮挡处理
  8. android 钉钉考勤日历,vue钉钉考勤日历 vue实现钉钉的考勤日历
  9. 传播模型——简单的元胞自动机(3)
  10. python在手机上可以画图吗_python可以画图么