如何利用Android设备轻松生成和扫描二维码?

Android二维码是一种基于Android平台的二维码扫描和生成技术,广泛应用于各种场景。

Android二维码

如何利用Android设备轻松生成和扫描二维码?

一、二维码简介

二维码(QR Code)全称“Quick Response Code”,是一种矩阵形的二维条码,由日本的Denso Wave公司于1994年发明,二维码能够存储比传统条形码更多的信息,并且能表示各种数据类型,如数字、字母、汉字等,二维码具有高密度、高容量和纠错能力等特点,因此在许多领域得到广泛应用,例如广告、支付、身份认证等。

二、ZXing库简介

ZXing(Zebra Crossing)是一个开源的条码图像处理库,支持多种格式的一维和二维条码,ZXing库使用Java语言编写,因此具有良好的跨平台特性,它的主要功能包括生成条码图像、解码图像中的条码以及处理相关数据,在Android平台上,ZXing库被广泛用于二维码的生成和扫描。

三、ZXing库的引入与配置

Maven依赖

为了在Android项目中使用ZXing库,可以在项目的build.gradle文件中添加以下依赖:

implementation 'com.google.zxing:core:3.3.0'

下载JAR包

如果不想通过Maven管理依赖,也可以从ZXing的官方网站或者Maven仓库下载核心库的JAR包,并将其添加到项目的libs目录中。

如何利用Android设备轻松生成和扫描二维码?

动态权限申请

由于二维码扫描需要调用相机,属于敏感权限,因此需要在运行时动态申请权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
} else {
    goScan();
}

onRequestPermissionsResult方法中处理权限申请结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CAMERA) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            goScan();
        } else {
            Toast.makeText(this, "权限被拒绝,无法打开相机", Toast.LENGTH_SHORT).show();
        }
    }
}

四、生成二维码

创建工具类

创建一个工具类QRCodeUtil,用于生成二维码:

public class QRCodeUtil {
    /**
     * 创建二维码位图
     *
     * @param content      字符串内容(支持中文)
     * @param width       位图宽度(单位:px)
     * @param height      位图高度(单位:px)
     * @return            Bitmap对象
     */
    public static Bitmap createQRCodeBitmap(String content, int width, int height) {
        return createQRCodeBitmap(content, width, height, "UTF-8", "H", "2", Color.BLACK, Color.WHITE);
    }
    /**
     * 创建二维码位图 (支持自定义配置和自定义样式)
     *
     * @param content          字符串内容
     * @param width           位图宽度,要求>=0(单位:px)
     * @param height          位图高度,要求>=0(单位:px)
     * @param character_set   字符集/字符转码格式 (支持格式:{@link CharacterSetECI }),传null时,zxing源码默认使用 "ISO-8859-1"
     * @param error_correction 容错级别 (支持级别:{@link ErrorCorrectionLevel }),传null时,zxing源码默认使用 "L"
     * @param margin          空白边距 (可修改,要求:整型且>=0), 传null时,zxing源码默认使用"4"。
     * @param color_black     黑色色块的自定义颜色值
     * @param color_white     白色色块的自定义颜色值
     * @return                Bitmap对象
     */
    public static Bitmap createQRCodeBitmap(String content, int width, int height,
                                           @Nullable String character_set, @Nullable String error_correction, @Nullable String margin,
                                           @ColorInt int color_black, @ColorInt int color_white) {
        if (TextUtils.isEmpty(content)) {
            return null;
        }
        if (width < 0 || height < 0) {
            return null;
        }
        try {
            Hashtable<EncodeHintType, String> hints = new Hashtable<>();
            if (!TextUtils.isEmpty(character_set)) {
                hints.put(EncodeHintType.CHARACTER_SET, character_set);
            }
            if (!TextUtils.isEmpty(error_correction)) {
                hints.put(EncodeHintType.ERROR_CORRECTION, error_correction);
            }
            if (!TextUtils.isEmpty(margin)) {
                hints.put(EncodeHintType.MARGIN, margin);
            }
            BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
            int[] pixels = new int[width * height];
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * width + x] = color_black;
                    } else {
                        pixels[y * width + x] = color_white;
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return null;
    }
}

调用工具类生成二维码

Bitmap qrCodeBitmap = QRCodeUtil.createQRCodeBitmap("这是一个测试二维码", 300, 300);
ImageView imageView = findViewById(R.id.qrcode);
imageView.setImageBitmap(qrCodeBitmap);

五、扫描二维码

ZXing库同样支持扫描二维码的功能,以下是一个简单的实现步骤:

1. 添加CaptureActivity及其依赖

如何利用Android设备轻松生成和扫描二维码?

AndroidManifest.xml中添加CaptureActivity:

<activity android:name="com.journeyapps.barcodescanner.CaptureActivity"
          android:screenOrientation="portrait"
          android:theme="@android:style/Theme.NoTitleBar"/>

启动扫描界面并获取结果

private void goScan() {
    Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
    startActivityForResult(intent, REQUEST_CODE_SCAN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
        if (data != null) {
            String content = data.getStringExtra(DecodeThread.DECODED_CONTENT_KEY);
            Bitmap bitmap = data.getParcelableExtra(DecodeThread.BARCODE_BITMAP_KEY);
            // 处理扫描结果
        }
    }
}

动态申请相机权限

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
} else {
    goScan();
}

onRequestPermissionsResult方法中处理权限申请结果:

@Override
public void onRequestPermissionsResult(int requestCode, int[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CAMERA) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            goScan();
        } else {
            Toast.makeText(this, "权限被拒绝,无法打开相机", Toast.LENGTH_SHORT).show();
        }
    }
}

六、归纳

ZXing库是一个功能强大且易于使用的二维码处理库,通过简单的配置和使用,可以方便地实现二维码的生成和扫描功能,本文介绍了如何在Android项目中引入ZXing库,并详细讲解了二维码生成和扫描的具体实现步骤,通过这些步骤,开发者可以轻松地在自己的应用中集成二维码功能,提升用户体验和应用的实用性。

原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1259904.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希新媒体运营
上一篇 2024-11-02 05:55
下一篇 2024-11-02 06:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入