Android中二维码的扫描与生成(zxing库)

家电维修 2023-07-16 19:17www.caominkang.com家电维修技术

目录

一.zxing是什么?

二.集成zxing框架

         三.界面设计

四.二维码生成

五.二维码扫描


一.zxing是什么?

zxing是google推出的一个开源的二维码框架,可以实现使用手机的摄像头完成二维码的扫描和解码

二.集成zxing框架

1. 将获取的jar包复制到工程的app/libs目录下,刷新,然后去添加依赖

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

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

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

draablebtn_back.png    flash_off.png    flash_on.png

layout复制activity_capture.xml,activity_scanner.xml,toolbar_scanner.xml

ra全部复制

values复制 / 替换其中的attrs.xml,ids.xml,colors.xml

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

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

 
 
 
 
 
 

7.运行一下工程,如果没报错的话就成功了

三.界面设计

activity_main.xml代码如下

<.google.android.material.appbar.AppBarLayout
 android:layout_idth="match_parent"
 android:layout_height="rap_content"
 android:theme="@style/AppTheme.AppBarOverlay">

 





<.google.android.material.floatingactionbutton.FloatingActionButton
 android:id="@+id/fab"
 android:layout_idth="rap_content"
 android:layout_height="rap_content"
 android:layout_gravity="bottom|end"
 app:srcCompat="@android:draable/ic_dialog_email" />

content.xml代码如下





四.二维码生成

创建类CreateUtil,并编写createQRCode()方法来实现

public class CreateUtil {
 //String codestring要生成二维码的字符串
 // int idth二维码图片的宽度
 // int height二维码图片的高度
 public static Bitmap createQRCode(String codestring,int idth,int height){
  try {
   //判断参数的合法性,要求字符串内容不能为空或图片长宽必须大于0
   if (TextUtils.isEmpty(codestring)||idth<=0||height<=0){
    return null;
   }
   //设置二维码的相关参数,生成BitMatrix(位矩阵)对象
   Hashtable hashtable=ne Hashtable<>();
   hashtable.put(EncodeHintType.CHARACTER_SET,"utf-8");  //设置字符转码格式
   hashtable.put(EncodeHintType.ERROR_CORRECTION,"H");   //设置容错级别
   hashtable.put(EncodeHintType.MARGIN,"2"); //设置空白边距
   //encode需要抛出和处理异常
   BitMatrix bitMatrix=ne QRCodeWriter().encode(codestring, BarcodeFormat.QR_CODE,idth,height,hashtable);
   //再创建像素数组,并根据位矩阵为数组元素赋颜色值
   int[] pixel=ne int[idthidth];
   for (int h=0;h 
 

在MainActivity中编写代码——生成二维码

//点击开始生成按钮监听事件
startBt1.setOnClickListener(ne Vie.OnClickListener() {
 @Override
 public void onClick(Vie v) {
  String input=inputEt.getText().toString();  //获取用户输入的字符串  
  //调用CreateUtil类生成二维码后显示在界面上
  contentIv.setImageBitmap(CreateUtil.createQRCode(input,contentIv.getWidth(),contentIv.getHeight()));
 }
});

五.二维码扫描

MainActivity中编写代码

  //开始扫描按钮点击事件监听
  startBt2.setOnClickListener(ne Vie.OnClickListener() {
   @Override
   public void onClick(Vie v) {
    scanQRCode();
   }
  });
 
 //实现扫描二维码的方法
 private void scanQRCode() {
  //申请相机权限
  if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
   ActivityCompat.requestPermissions(this, ne String[]{Manifest.permission.CAMERA}, Constant.REQ_PERM_CAMERA);
   return;
  }
  //申请文件(相册)读写权限
  if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
   ActivityCompat.requestPermissions(this, ne String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, Constant.REQ_PERM_EXTERNAL_STORAGE);
   return;
  }
  //二维码扫码
  //然后通过Intent机制启动zxing框架的CaptureActivity,请求返回结果
  Intent intent = ne Intent(this, CaptureActivity.class);
  startActivityForResult(intent, Constant.REQ_QR_CODE);
 }

 @Override
 protected 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);
  }
 }

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  sitch (requestCode){
   case Constant.REQ_PERM_CAMERA:
    //摄像头权限申请
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     //获得授权
     scanQRCode();
    } else {
     //被禁止授权
     Toast.makeText(this, "请至权限中心打开本应用的相机访问权限", Toast.LENGTH_LONG).sho();
    }
    break;
   case Constant.REQ_PERM_EXTERNAL_STORAGE:
    //文件读写权限申请
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     //获得授权
     scanQRCode();
    } else {
     //被禁止授权
     Toast.makeText(this, "请至权限中心打开本应用的文件读写权限", Toast.LENGTH_LONG).sho();
    }
    break;
  }
 }
}

到此,一个简易的二维码生成与扫描就完成了

Copyright © 2016-2025 www.jianfeikang.com 建飞家电维修 版权所有 Power by