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目录中。
动态权限申请
由于二维码扫描需要调用相机,属于敏感权限,因此需要在运行时动态申请权限:
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及其依赖
在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
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复