Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)
程序员文章站
2024-02-13 15:34:58
首先声明我们通篇用的都是google开源框架zxing,要实现的功能有三个 ,生成普通二维码、生成带有中心图片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 二维码、及扫描解析二维码),希望对大家有所帮助
推荐阅读
-
Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)
-
Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)
-
Android中Zxing二维码的扫描、生成(带有动态权限申请)
-
彩色二维码生成器,带logo文字和中心文字 彩色二维码生成器,带logo文字和中心文字 使用.net 4.0和zxing开发, 内容支持中文,使用UTF-8编码,一般扫描二维码软件可以识别。 最上方显示文字log,字数可以调节。 正中间的圆圈内显示中心文字。 微盘下载地址:彩色二维码生成器.net2.0win7可用byKimmKing.zip
-
彩色二维码生成器,带logo文字和中心文字 彩色二维码生成器,带logo文字和中心文字 使用.net 4.0和zxing开发, 内容支持中文,使用UTF-8编码,一般扫描二维码软件可以识别。 最上方显示文字log,字数可以调节。 正中间的圆圈内显示中心文字。 微盘下载地址:彩色二维码生成器.net2.0win7可用byKimmKing.zip
-
在Thinkphp3.2.3中phpqrcode生成带logo的二维码的实现方法
-
在Thinkphp3.2.3中phpqrcode生成带logo的二维码的实现方法