生成和扫描二维码(ZXing库)
生成和扫描二维码(ZXing库)
一、ZXing概述
ZXing是谷歌自己推出的一个开源源码的二维码框架,可以实现使用手机的摄像头完成条形码的扫描和解码。
二、整合ZXing框架
将预先获取的core-3.4.0.jar包复制到工程的app\libs目录,刷新,然后添加依赖
集成java源码,将demo工程QrScan中app\src\main\java目录下包中的zxing和util复制到本工程对应的app\src\main\java的包下
然后修改package包名,修改import路径,修改类包名
同步资源,复制资源目录
drawable:btn_back.png,flash_off.png,flash_on.png
layout:复制activity_capture.xml,activity_scanner.xml,toolbar_scanner.xml
raw:全部复制
values:复制/替换其中的attrs.xml,ids.xml,colors.xml
修改工具栏框架包和ViewFinderView包路径
打开开发权限,在清单文件中添加开发权限
<uses-permission android:name="android.permission.VIBRATE"></uses-permission><uses-permission android:name="android.permission.CAMERA"></uses-permission><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission><activity android:name=".zxing.activity.CaptureActivity"></activity>
最后运行一下工程,如果不出现错误则整合成功
三、界面设计
activity_main.xml
<com.google.android.material.appbar.AppBarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:theme="@style/AppTheme.AppBarOverlay"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:popupTheme="@style/AppTheme.PopupOverlay" /></com.google.android.material.appbar.AppBarLayout><include layout="@layout/content_main" /><com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|end"app:srcCompat="@android:drawable/ic_dialog_email" />
content_main.xml
<TextViewandroid:id="@+id/myTextView"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginTop="48dp"android:hint="扫描结果"android:textSize="24sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/myScanButton"app:layout_constraintVertical_bias="0.0" /><EditTextandroid:id="@+id/myEditText"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:ems="10"android:hint="输入要生成二维码的字符"android:inputType="textPersonName"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/myCreateButton"android:layout_width="0dp"android:layout_height="wrap_content"android:text="开 始 生 成"android:textSize="18sp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/myEditText" /><ImageViewandroid:id="@+id/myImageView"android:layout_width="202dp"android:layout_height="196dp"android:layout_marginTop="64dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.497"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/myCreateButton"app:srcCompat="@android:drawable/screen_background_light_transparent" /><Buttonandroid:id="@+id/myScanButton"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginTop="36dp"android:text="开 始 扫 描"android:textSize="18sp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.0"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/myImageView" />
四、二维码生成
创建类CreateUtil,并编写createQRCode方法来实现
public class CreateUtil {//String codestring:要生成二维码的字符串// int width:二维码图片的宽度// int height:二维码图片的高度public static Bitmap createQRCode(String codestring,int width,int height){try {//首先判断参数的合法性,要求字符串内容不能为空或图片长宽必须大于0if (TextUtils.isEmpty(codestring)||width<=0||height<=0){return null;}//设置二维码的相关参数,生成BitMatrix(位矩阵)对象Hashtable<EncodeHintType,String> hashtable=new Hashtable<>();hashtable.put(EncodeHintType.CHARACTER_SET,"utf-8"); //设置字符转码格式hashtable.put(EncodeHintType.ERROR_CORRECTION,"H"); //设置容错级别hashtable.put(EncodeHintType.MARGIN,"2"); //设置空白边距//encode需要抛出和处理异常BitMatrix bitMatrix=new QRCodeWriter().encode(codestring, BarcodeFormat.QR_CODE,width,height,hashtable);//再创建像素数组,并根据位矩阵为数组元素赋颜色值int[] pixel=new int[width*width];for (int h=0;h<height;h++){for (int w=0;w<width;w++){if (bitMatrix.get(w,h)){pixel[h*width+w]= Color.BLACK; //设置黑色色块}else{pixel[h*width+w]=Color.WHITE; //设置白色色块}}}//创建bitmap对象//根据像素数组设置Bitmap每个像素点的颜色值,之后返回Bitmap对象Bitmap qrcodemap=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);qrcodemap.setPixels(pixel,0,width,0,0,width,height);return qrcodemap;}catch (WriterException e){return null;}}
}
在MainActivity中编写代码生成二维码
//点击开始生成按钮监听事件
startBt1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String input=inputEt.getText().toString(); //获取用户输入的字符串 //调用CreateUtil类生成二维码后显示在界面上contentIv.setImageBitmap(CreateUtil.createQRCode(input,contentIv.getWidth(),contentIv.getHeight()));}
});
五、二维码扫描
在MainActivity中编写代码
//开始扫描按钮点击事件监听startBt2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {scanQRCode();}});//实现扫描二维码的方法private void scanQRCode() {//申请相机权限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, Constant.REQ_PERM_CAMERA);return;}//申请文件(相册)读写权限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Constant.REQ_PERM_EXTERNAL_STORAGE);return;}//二维码扫码//然后通过Intent机制启动zxing框架的CaptureActivity,请求返回结果Intent intent = new Intent(this, CaptureActivity.class);startActivityForResult(intent, Constant.REQ_QR_CODE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);//扫描结果回调if (requestCode == Constant.REQ_QR_CODE && resultCode == RESULT_OK) {Bundle bundle = data.getExtras();String scanResult = bundle.getString(Constant.INTENT_EXTRA_KEY_QR_SCAN);//将扫描出的信息显示出来resultTv.setText(scanResult);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode){case Constant.REQ_PERM_CAMERA://摄像头权限申请if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//获得授权scanQRCode();} else {//被禁止授权Toast.makeText(this, "请至权限中心打开本应用的相机访问权限", Toast.LENGTH_LONG).show();}break;case Constant.REQ_PERM_EXTERNAL_STORAGE://文件读写权限申请if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//获得授权scanQRCode();} else {//被禁止授权Toast.makeText(this, "请至权限中心打开本应用的文件读写权限", Toast.LENGTH_LONG).show();}break;}}
}
生成和扫描二维码(ZXing库)相关推荐
- 只需3个步骤,轻松解决程序员在Java中生成、扫描二维码难题
条形码包含有关产品或公司的信息,以机器可读的形式直观地表示.条码广泛用于跟踪货物和库存管理.我们可以在 WPF 应用程序中轻松生成各种类型的条码.二维码广泛用于分享重要信息.对于不同的要求,您可能希望 ...
- 使用zxing包生成和扫描二维码和一维码
在开发之前要先下载zxing包对其简化,新建一个android工程,把zxing包中的android和android-code中的文件复制到相应的文件夹里面 其中的libs文件夹里需要zxing包中的 ...
- Android 简单直接--无需jar包zing实现生成、扫描二维码
Zing 导入依赖 生成二维码 扫描二维码 扫描回调 工具类 设置竖屏扫描 不多逼逼,直接上代码 导入依赖 implementation 'com.google.zxing:core:3.3.0' i ...
- 转【微信小程序 四】二维码生成/扫描二维码
原文:https://blog.csdn.net/xbw12138/article/details/75213274 前端 二维码生成 二维码要求:每分钟刷新一次,模拟了个鸡肋,添加了个按分钟显示 ...
- 【微信小程序 四】二维码生成/扫描二维码
前端 二维码生成 二维码要求:每分钟刷新一次,模拟了个鸡肋,添加了个按分钟显示的时间加在二维码中,起到刷新的作用,在onshow中每次打开界面就会刷新显示 var QR = require(" ...
- 【Android】实现生成二维码、条形码和扫描二维码的功能
目录 一.添加依赖 二.布局文件 三.实现生成二维码的功能 四.效果图 一.添加依赖 要先添加一个第三方库来实现二维码的生成以及扫描二维码的功能,开源库如下: 在build.grade(Moudle) ...
- 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
GitHub项目的链接地址 目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 ZXing 生成可自定义颜色.带 logo 的二维 ...
- Unity之生成扫描二维码
Unity之生成扫描二维码 Unity之生成扫描二维码 前言 开篇 Unity版本及使用插件 正题 前期准备 首先生成二维码 然后需要扫描二维码 该使用了 挂载脚本绑定按钮和输入框 运行内容 生成二维 ...
- 如何用 Python 生成炫酷二维码及解析
如今二维码可以说遍及了我们生活的各个角落,基本上我们的衣食住行都会见到二维码的身影.Python 用于生成及解析二维码的库为:qrcode.myqr 和 zxing,安装通过 pip install ...
最新文章
- css如何做玻璃效果_拓展训练之后的效果保持工作该如何做?
- 用1天快速上手org-mode(windows系统)
- 单例模式及getInstance()的用法
- codevs1688 求逆序对(权值线段树)
- 【PP生产订单】入门介绍(十三)
- c mssql mysql_mssql与mysql 数据迁移
- 部署docker-consul群集,Harbor构建Docker私有仓库
- mysql从5.5直接升级到5.7后,执行mysql_upgrade速度很慢且执行结束后数据目录大小增加一倍及 mysqlpump备份出现1577错误...
- 数据库备份与快照备份
- rancher 权限 添加用户_Kubernetes身份认证和授权操作全攻略:访问控制之Service Account...
- 汽车之家论坛字体反爬
- ubuntu/linux系统知识(14)ubuntu 搜狗输入法不见了,重启方法
- 【PS4开发】如何通过unity3d发布ps4应用
- 怎么用微信打开链接才不会提示已停止访问网页
- 金蝶kis修改服务器,金蝶kis 修改服务器地址
- 最短路径(加权有向图)
- flutter 语音转文字(科大讯飞)
- SAEJ1939-21数据链路层部分解读(第一部分)
- Android --- IjkPlayer 阅读native层源码之解码成功后的音频数据如何发送回Android播放(九)
- 映射变换(缩放、旋转、剪切)