Android studio生成二维码

news/2024/11/16 21:25:09/

1.遇到的问题

需要生成一个二维码,可以使用zxing第三方组件,增加依赖。

//生成二维码
implementation 'com.google.zxing:core:3.4.1'

2.代码 

  • 展示页面
<ImageViewandroid:id="@+id/qrCodeImageView"android:layout_width="150dp"android:layout_height="150dp"android:drawablePadding="16dp"android:background="@drawable/button_round_4"tools:layout_editor_absoluteX="176dp"tools:layout_editor_absoluteY="523dp" />

  • 引用ImageView
ImageView qrCodeImageView;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().getAttributes().systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE;setContentView(R.layout.activity_config);qrCodeImageView = findViewById(R.id.qrCodeImageView);
}
  • 创建二维码方法 

使用了几个方法,会出现乱码,通过最后这这种方式解决 

private void create_QR_code() throws WriterException {QRCodeWriter qrCodeWriter = new QRCodeWriter();String text= "成绩:1000 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三";// 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败Hashtable<EncodeHintType, String> hints = new Hashtable<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");BitMatrix matrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, 150, 150, hints);int width = matrix.getWidth();int height = matrix.getHeight();// 二维矩阵转为一维像素数组,也就是一直横着排了int[] pixels = new int[width * height];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {if (matrix.get(x, y)) {pixels[y * width + x] = 0xff000000;}}}Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);// 通过像素数组生成bitmap,具体参考apibitmap.setPixels(pixels, 0, width, 0, 0, width, height);/*byte[] utf8Bytes = text.getBytes(StandardCharsets.UTF_8);String utf8BytesString = new String(utf8Bytes, StandardCharsets.UTF_8);// 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");BitMatrix bitMatrix = qrCodeWriter.encode(utf8BytesString, BarcodeFormat.QR_CODE, 150, 150);Bitmap bitmap = Bitmap.createBitmap(150, 150, Bitmap.Config.RGB_565);for (int x = 0; x < 150; x++) {for (int y = 0; y < 150; y++) {bitmap.setPixel(x, y, bitMatrix.get(x, y) ? getResources().getColor(R.color.black) : getResources().getColor(R.color.colorAccent));}}*/
/*        hashMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);//定义二维码的纠错级别,为LhashMap.put(EncodeHintType.CHARACTER_SET, "utf-8");//设置字符编码为utf-8hashMap.put(EncodeHintType.MARGIN, 2);//设置margin属性为2,也可以不设置String contents = "最简单的Demo"; //定义二维码的内容BitMatrix bitMatrix = null;   //这个类是用来描述二维码的,可以看做是个布尔类型的数组try {bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, 150, 150, hashMap);//调用encode()方法,第一次参数是二维码的内容,第二个参数是生二维码的类型,第三个参数是width,第四个参数是height,最后一个参数是hints属性} catch (WriterException e) {e.printStackTrace();}int width = bitMatrix.getWidth();//获取widthint height = bitMatrix.getHeight();//获取heightint[] pixels = new int[width * height]; //创建一个新的数组,大小是width*heightfor (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {//通过两层循环,为二维码设置颜色if (bitMatrix.get(i, j)) {pixels[i * width + j] = Color.BLACK;  //设置为黑色} else {pixels[i * width + j] = Color.WHITE; //设置为白色}}}//调用Bitmap的createBitmap(),第一个参数是width,第二个参数是height,最后一个是config配置,可以设置成RGB_565bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);//调用setPixels(),第一个参数就是上面的那个数组,偏移为0,x,y也都可为0,根据实际需求来,最后是width ,和heightbitmap.setPixels(pixels, 0, width, 0, 0, width, height);*///调用setImageBitmap()方法,将二维码设置到imageview控件里qrCodeImageView.setImageBitmap(bitmap);}


http://www.ppmy.cn/news/1263330.html

相关文章

Python并发-线程和进程

一、线程和进程对应的问题 **1.进程&#xff1a;**CPU密集型也叫计算密集型&#xff0c;指的是系统的硬盘、内存性能相对CPU要好很多&#xff0c;此时&#xff0c;系统运作大部分的状况是CPU Loading 100%&#xff0c;CPU要读/写I/O(硬盘/内存)&#xff0c;I/O在很短的时间就可…

HttpComponents: 领域对象的设计

1. HTTP协议 1.1 HTTP请求 HTTP请求由请求头、请求体两部分组成&#xff0c;请求头又分为请求行(request line)和普通的请求头组成。通过浏览器的开发者工具&#xff0c;我们能查看请求和响应的详情。 下面是一个HTTP请求发送的完整内容。 POST https://track.abc.com/v4/tr…

【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、剑指offer每日一练 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️寻找文件副本(题目难度&#xff1a;简单)1.1 题目1.2 示例1.3 限制1.4 解题思路一c代…

数学建模-二氧化碳排放及时空分布测度

二氧化碳排放及时空分布测度 整体求解过程概述(摘要) 面临全球气候变化的巨大挑战&#xff0c;我国积极响应《巴黎协定》的号召&#xff0c;提出“2030年前碳达峰&#xff0c;2060 年前实现碳中和”的碳排放发展目标&#xff0c;并将碳中和相关工作作为 2021 年的重点任务之一…

vant组件库中Toast组件文本无法实现全在一行,怎么设置在两行显示而且居中

一般我们的Toast使用: Toast(分享成功); 当字数很多的时候,我们需要使用: Toast({ type: html, message: "<div styletext-align:center;width: 4rem;>分享成功<br>您已获得过抽奖次数</div>" }) 用div包括文字,然后用br换行,在设置样式居中,就…

蓝桥杯 java基础

1. AB问题I 时间限制&#xff1a;2.000S 空间限制&#xff1a;32MB 题目描述 你的任务是计算ab。 输入描述 输入包含一系列的a和b对&#xff0c;通过空格隔开。一对a和b占一行。 输出描述 对于输入的每对a和b&#xff0c;你需要依次输出a、b的和。 如对于输入中的第二…

解读Stable Video Diffusion:详细解读视频生成任务中的数据清理技术

Diffusion Models视频生成-博客汇总 前言:Stable Video Diffusion已经开源一周多了,技术报告《Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets》对数据清洗的部分描述非常详细,虽然没有开源源代码,但是博主正在尝试复现其中的操作。这篇…

算法:合并两个有序数组(双指针)

时间复杂度 O(m n)&#xff0c;空间复杂度 O(1) /*** param {number[]} nums1* param {number} m* param {number[]} nums2* param {number} n* return {void} Do not return anything, modify nums1 in-place instead.*/ var merge function(nums1,m,nums2,n) {let p1 m-1…