生成和扫描二维码(ZXing库)

一、ZXing概述

ZXing是谷歌自己推出的一个开源源码的二维码框架,可以实现使用手机的摄像头完成条形码的扫描和解码。

二、整合ZXing框架

  1. 将预先获取的core-3.4.0.jar包复制到工程的app\libs目录,刷新,然后添加依赖

  2. 集成java源码,将demo工程QrScan中app\src\main\java目录下包中的zxing和util复制到本工程对应的app\src\main\java的包下

  3. 然后修改package包名,修改import路径,修改类包名

  4. 同步资源,复制资源目录

    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

  5. 修改工具栏框架包和ViewFinderView包路径

  6. 打开开发权限,在清单文件中添加开发权限

        <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>
    
  7. 最后运行一下工程,如果不出现错误则整合成功

三、界面设计

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库)相关推荐

  1. 只需3个步骤,轻松解决程序员在Java中生成、扫描二维码难题

    条形码包含有关产品或公司的信息,以机器可读的形式直观地表示.条码广泛用于跟踪货物和库存管理.我们可以在 WPF 应用程序中轻松生成各种类型的条码.二维码广泛用于分享重要信息.对于不同的要求,您可能希望 ...

  2. 使用zxing包生成和扫描二维码和一维码

    在开发之前要先下载zxing包对其简化,新建一个android工程,把zxing包中的android和android-code中的文件复制到相应的文件夹里面 其中的libs文件夹里需要zxing包中的 ...

  3. Android 简单直接--无需jar包zing实现生成、扫描二维码

    Zing 导入依赖 生成二维码 扫描二维码 扫描回调 工具类 设置竖屏扫描 不多逼逼,直接上代码 导入依赖 implementation 'com.google.zxing:core:3.3.0' i ...

  4. 转【微信小程序 四】二维码生成/扫描二维码

    原文:https://blog.csdn.net/xbw12138/article/details/75213274 前端  二维码生成  二维码要求:每分钟刷新一次,模拟了个鸡肋,添加了个按分钟显示 ...

  5. 【微信小程序 四】二维码生成/扫描二维码

    前端 二维码生成 二维码要求:每分钟刷新一次,模拟了个鸡肋,添加了个按分钟显示的时间加在二维码中,起到刷新的作用,在onshow中每次打开界面就会刷新显示 var QR = require(" ...

  6. 【Android】实现生成二维码、条形码和扫描二维码的功能

    目录 一.添加依赖 二.布局文件 三.实现生成二维码的功能 四.效果图 一.添加依赖 要先添加一个第三方库来实现二维码的生成以及扫描二维码的功能,开源库如下: 在build.grade(Moudle) ...

  7. 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

    GitHub项目的链接地址 目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 ZXing 生成可自定义颜色.带 logo 的二维 ...

  8. Unity之生成扫描二维码

    Unity之生成扫描二维码 Unity之生成扫描二维码 前言 开篇 Unity版本及使用插件 正题 前期准备 首先生成二维码 然后需要扫描二维码 该使用了 挂载脚本绑定按钮和输入框 运行内容 生成二维 ...

  9. 如何用 Python 生成炫酷二维码及解析

    如今二维码可以说遍及了我们生活的各个角落,基本上我们的衣食住行都会见到二维码的身影.Python 用于生成及解析二维码的库为:qrcode.myqr 和 zxing,安装通过 pip install ...

最新文章

  1. css如何做玻璃效果_拓展训练之后的效果保持工作该如何做?
  2. 用1天快速上手org-mode(windows系统)
  3. 单例模式及getInstance()的用法
  4. codevs1688 求逆序对(权值线段树)
  5. 【PP生产订单】入门介绍(十三)
  6. c mssql mysql_mssql与mysql 数据迁移
  7. 部署docker-consul群集,Harbor构建Docker私有仓库
  8. mysql从5.5直接升级到5.7后,执行mysql_upgrade速度很慢且执行结束后数据目录大小增加一倍及 mysqlpump备份出现1577错误...
  9. 数据库备份与快照备份
  10. rancher 权限 添加用户_Kubernetes身份认证和授权操作全攻略:访问控制之Service Account...
  11. 汽车之家论坛字体反爬
  12. ubuntu/linux系统知识(14)ubuntu 搜狗输入法不见了,重启方法
  13. 【PS4开发】如何通过unity3d发布ps4应用
  14. 怎么用微信打开链接才不会提示已停止访问网页
  15. 金蝶kis修改服务器,金蝶kis 修改服务器地址
  16. 最短路径(加权有向图)
  17. flutter 语音转文字(科大讯飞)
  18. SAEJ1939-21数据链路层部分解读(第一部分)
  19. Android --- IjkPlayer 阅读native层源码之解码成功后的音频数据如何发送回Android播放(九)
  20. 映射变换(缩放、旋转、剪切)

热门文章

  1. 小程序微信运动时间戳格式转换+列表渲染微信运动数据
  2. Java小白常问的问题大全
  3. 人工智能导论——概念篇
  4. Qt编写安防视频监控系统61-子模块5设备控制
  5. js+json实现哔哩哔哩番剧时间表
  6. 很火的区块链头部游戏《Axie Infinity》单日盈收竟与王者荣耀争锋,它是什么?
  7. typora-数学符号
  8. SQLDbx工具连接Oracle数据库
  9. 焊接大师给您支招——10种焊接堵漏方法供你选
  10. 基于项目的协同过滤推荐算法单机版代码实现(包含输出电影-用户评分矩阵模型、项目相似度、推荐结果、平均绝对误差MAE)