【Android学习】Android二维码工具开发

253 阅读2分钟

公 众 号:码代
本文作者: @MuMu
编写日期:2024年03月24日
本文字数:1244个字符
关注可了解更多的教程。问题或建议,请公众号留言;

图片

摘要:

本文主要介绍使用Android和Android studio完成开发一个二维码生成和识别小工具。本文小工具的二维码生成模块可以把文本内容生成二维码,二维码识别(扫描)模块可以识别标准的二维码并把识别结果显示出来。

本文小工具(安卓二维码识别和生成工具)提供源码下载方式,源码获取方式见文章未处。

/ 开始 /

效果演示

首页生成二维码
扫描扫描结果

开发

创建项目

打开Android studio 选择一个空模板创建一个Android项目

  • 选择项目模板

  • 配置填写项目初始化信息

修改项目

生成二维码和扫码需要使用zxing库,所以在app的build.gradle文件里添加zxing库的配置。

 implementation 'com.google.zxing:core:3.4.0'
 implementation 'com.journeyapps:zxing-android-embedded:4.2.0'

页面创建

创建项目时Android studio自动默认为我们创建了MianActivity,我们可以把MianActivity作为项目的首页。我们再创建一个ScanActivity作为扫码二维码的页面。

首页功能

首页设计包含一个二维码内容的输入框组件(EditText),显示二维码图片组件(IamgeView),生成二维码按钮组件(Button),扫码二维码按钮(Button)组件。

首页逻辑

  • 生成二维码

在输入框输入二维码内容后点击生成二维码按钮,生成二维码并使用ImageView显示生成的二维码图片。

private void createQRCOde(){
    // 获取输入框内容
    textToEncode = etQRCodeText.getText().toString();
    if (textToEncode.length()==0) {
        showToast("请输入内容"); return;
    }

    try {
        // 使用 MultiFormatWriter 生成 BitMatrix
        BitMatrix bitMatrix = new MultiFormatWriter().encode(textToEncode, BarcodeFormat.QR_CODE, 500, 500);

        // 使用 BarcodeEncoder 将 BitMatrix 转换为 Bitmap
        BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
        Bitmap bitmap = barcodeEncoder.createBitmap(bitMatrix);

        // 在 ImageView 中显示生成的二维码
        qrcode_image.setImageBitmap(bitmap);

    } catch (Exception e) {
        e.printStackTrace();
    }
}
  • 扫码二维码

点击扫码按钮跳转扫码页面

private void toScan(){
    startActivity(new Intent(context, ScanActivity.class));
}

扫码页面功能

扫码页面包含一个com.journeyapps.barcodescanner.CompoundBarcodeView组件,用来扫二维码。

扫码页面逻辑

扫码页面我们CompoundBarcodeView组件来处理扫描二维码,应用获取摄像头权限后

申请摄像头权限

// 检查摄像头权限
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {
    // 如果应用没有摄像头权限,请求权限
    Toast.makeText(this, "请设置摄像头权限", Toast.LENGTH_SHORT).show();
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
            200);
} else {
    scan();  // 有权限执行扫码函数
}
// 扫码函数
private void scan(){
        barcodeView.resume();
        barcodeView.decodeContinuous(new BarcodeCallback() {
            @Override
            public void barcodeResult(BarcodeResult result) {
                if (result.getText() != null) {
                    barcodeView.pause();
                    showScanResultDialog(context, result.getText());
                }
            }

            @Override
            public void possibleResultPoints(List<ResultPoint> resultPoints) {

            }
        });
    }
  • 显示扫码结果
// 二维码扫码结果显示函数
private   void showScanResultDialog(Context context, String scanResult) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);

    builder.setTitle("扫码结果");
    builder.setCancelable(false);

    LayoutInflater inflater = LayoutInflater.from(context);
    View dialogView = inflater.inflate(R.layout.dialog_scan_result, null);
    builder.setView(dialogView);
    TextView textView = dialogView.findViewById(R.id.text_scan_result);
    textView.setText(scanResult);

    builder.setPositiveButton("复制", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            copyToClipboard(scanResult);
            scan();
        }
    });

    builder.setNegativeButton("关闭", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            scan();
        }
    });


    AlertDialog dialog = builder.create();
    dialog.show();
}

获取源码

image.png

mp.weixin.qq.com/s/uV_kP-IvV…