首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在android zxing中扫描嵌入权重的条形码

在Android中使用ZXing库进行扫描嵌入权重的条形码可以按以下步骤进行:

  1. 首先,确保你的Android项目中已经集成了ZXing库。你可以通过将以下代码添加到项目的build.gradle文件中来添加ZXing依赖项:
代码语言:txt
复制
implementation 'com.google.zxing:core:3.4.0'
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
  1. 创建一个用于扫描的Activity或Fragment,并在布局文件中添加一个用于扫描的视图。
  2. 在你的扫描Activity或Fragment的代码中,使用ZXing库提供的CaptureManager类来管理扫描过程。你可以在onCreate方法中初始化CaptureManager,并在onResume方法中启动扫描:
代码语言:txt
复制
private CaptureManager captureManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // 初始化CaptureManager
    captureManager = new CaptureManager(this, barcodeScannerView);

    // 设置自定义的条形码解码器,以处理嵌入权重的条形码
    captureManager.getBarcodeView().setDecoderFactory(new WeightedDecoderFactory());

    // 启动扫描
    captureManager.initializeFromIntent(getIntent(), savedInstanceState);
    captureManager.decode();
}

@Override
protected void onResume() {
    super.onResume();
    captureManager.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    captureManager.onPause();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    captureManager.onDestroy();
}
  1. 创建一个自定义的条形码解码器,用于处理嵌入权重的条形码。你可以继承DefaultDecoderFactory类并实现自定义的解码器。在解码器中,你可以使用ZXing提供的WeightedQRCodeReader类来处理嵌入权重的条形码:
代码语言:txt
复制
import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.client.android.DecodeFormatManager;
import com.google.zxing.client.android.DecodeHintManager;
import com.google.zxing.client.android.camera.PlanarYUVLuminanceSource;
import com.google.zxing.client.android.camera.open.CameraFacing;
import com.google.zxing.client.android.camera.open.OpenCamera;
import com.google.zxing.client.android.result.ResultHandler;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.DecodeForcer;
import com.journeyapps.barcodescanner.Decoder;
import com.journeyapps.barcodescanner.DecoderFactory;
import com.journeyapps.barcodescanner.DecodingOptions;
import com.journeyapps.barcodescanner.SourceData;
import com.journeyapps.barcodescanner.camera.CameraManager;
import com.journeyapps.barcodescanner.camera.PlanarYUVLuminanceSource;
import com.journeyapps.barcodescanner.camera.Size;

import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class WeightedDecoderFactory extends DefaultDecoderFactory {

    public WeightedDecoderFactory() {
        super();
    }

    @Override
    protected Decoder createDecoder(Map<DecodeHintType, ?> baseHints) {
        MultiFormatReader reader = new MultiFormatReader();
        List<BarcodeFormat> formats = new ArrayList<>();
        formats.addAll(DecodeFormatManager.ONE_D_FORMATS);
        formats.addAll(DecodeFormatManager.QR_CODE_FORMATS);
        formats.addAll(DecodeFormatManager.DATA_MATRIX_FORMATS);
        reader.setHints(getHints(formats, baseHints));
        return new WeightedDecoder(reader);
    }

    private Map<DecodeHintType, ?> getHints(Collection<BarcodeFormat> formats, Map<DecodeHintType, ?> baseHints) {
        Map<DecodeHintType, Object> hints = new EnumMap<>(DecodeHintType.class);
        hints.putAll(baseHints);
        hints.put(DecodeHintType.POSSIBLE_FORMATS, formats);
        return hints;
    }

    private static class WeightedDecoder extends Decoder {
        private MultiFormatReader reader;

        public WeightedDecoder(MultiFormatReader reader) {
            super(reader);
            this.reader = reader;
        }

        @Override
        public Result decode(SourceData source) {
            Result weightedResult = null;
            Result normalResult = null;
            try {
                PlanarYUVLuminanceSource luminanceSource = cameraManager.buildLuminanceSource(source);
                BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(luminanceSource));

                WeightedQRCodeReader weightedReader = new WeightedQRCodeReader(reader);

                try {
                    weightedResult = weightedReader.decode(bitmap, hintManager.buildDecodeHints());
                } catch (NotFoundException e) {
                    // Continue decoding using normal QRCodeReader
                    normalResult = reader.decodeWithState(bitmap);
                } finally {
                    reader.reset();
                }
            } catch (Throwable t) {
                Log.e(TAG, "Unexpected error during decoding", t);
            }

            if (weightedResult != null) {
                return weightedResult;
            } else {
                return normalResult;
            }
        }
    }

    private static class WeightedQRCodeReader extends QRCodeReader {
        private final double weightThreshold = 0.8; // 嵌入权重的阈值

        public WeightedQRCodeReader(Reader delegate) {
            super(delegate);
        }

        @Override
        public Result decode(BinaryBitmap image, Map<DecodeHintType, ?> hints) throws NotFoundException, ChecksumException, FormatException {
            Result result = super.decode(image, hints);
            if (result != null && result instanceof WeightedResult) {
                WeightedResult weightedResult = (WeightedResult) result;
                if (weightedResult.getWeight() >= weightThreshold) {
                    return result;
                }
            }
            throw NotFoundException.getNotFoundInstance();
        }
    }
}
  1. 在上面的代码中,weightThreshold表示嵌入权重的阈值,你可以根据需要进行调整。如果嵌入权重的条形码的权重大于等于阈值,才会被认为是有效的条形码。

这样,你就可以在Android中使用ZXing库扫描嵌入权重的条形码了。记得根据实际需求,适当调整代码并添加错误处理逻辑。

腾讯云相关产品和产品介绍链接地址:

请注意,以上提到的产品和链接仅供参考,具体选择适合自己项目需求的产品需要进行进一步的研究和评估。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 如何在线生成二维码?

    一、介绍 说到二维码,我相信大家每天都会用到,尤其是在手机支付的场景,使用频率极广。 实际上二维码在1994年的时候就已经诞生了,由 Denso 公司研制而成,只是那个时候使用范围还不是很大。 早期的二维码由于很容易通过技术方式进行伪造,因此很少有企业愿意去使用他,随着技术的不断迭代和更新,二维码的安全性更进一步得到了提升,从而使得更多的企业愿意使用这项新技术,例如当下的移动支付,还有微信互推,扫码出行等等,极大的方便了网民们的购物、社交和出行! 在实际的业务开发过程中,二维码的使用场景开发也会经常出现在我们开发人员的面前,我们应该如何去处理呢,今天小编就带着大家一起深入的了解一下它的技术实现过程。 二、代码实践 在 Java 生态体系里面,操作二维码的开源项目很多,如 SwetakeQRCode、BarCode4j、Zxing 等等。 今天我们介绍下简单易用的 google 公司的 zxing,zxing 不仅使用方便,而且可以还操作条形码或者二维码等,不仅有 java 版本,还有 Android 版。 开源库地址:

    02

    Android开发笔记(一百八十三)利用HMS轻松扫描二维码

    开源的Android系统实际上只提供基本的系统服务,不提供常见的扩展服务诸如地图、邮箱、搜索、推送、机器学习、应用内支付等,这些扩展服务被谷歌公司打包成GMS套件(全称Google Mobile Service,中文名叫谷歌移动服务)。在海外市场,许多商用App都依赖于GMS提供的服务,手机缺少GMS会使得这些App没法使用,而手机厂商预装GMS套件需要获得谷歌公司授权。2019年华为公司遭到美国制裁,导致华为手机没能获得GMS授权,致使海外市场陷入寒冬。为此,华为公司推出了自主可控的HMS套件(全称Huawei Mobile Service,中文名叫华为移动服务),意图打破制裁。 HMS是华为公司提供的一套App扩展服务框架,它分为两部分,一部分是面向普通用户的预装App,包括花瓣地图、花瓣邮箱、花瓣搜索、花瓣支付等;另一部分是面向开发者的HMS Core,它给开发者提供API接口,用于在App开发时集成相关服务。HMS Core是华为移动服务提供的端、云开放能力的合集,包含华为账号、应用内支付、推送服务、游戏服务、定位服务、地图服务、广告服务和机器学习服务等,它的开源代码仓库地址为https://gitee.com/hms-core,开发者可在该仓库下载对应源码学习。 扫描二维码是HMS的一项基础服务,虽然谷歌公司也提供了zxing扫码框架,但是zxing框架的集成步骤不够简洁,而且它的识别速度偏慢,识别准确率也不高,远不如HMS的扫码服务来得好用。下面介绍如何在App工程中集成HMS的扫码服务。 首先,因为扫码属于第三方服务,所以要修改模块的build.gradle,往dependencies节点添加如下一行配置,表示导入指定版本的扫码库:

    02

    10X Cell Ranger ATAC 算法概述

    执行此步骤是为了修复条形码(barcode,细胞的标识)中偶尔出现的测序错误,从而使片段与原始条形码相关联,从而提高数据质量。16bp条形码序列是从“I2”索引读取得到的。每个条形码序列都根据正确的条形码序列的“白名单”进行检查,并计算每个白名单条形码的频率。我们试图纠正不在白名单上的条形码,方法是找出所有白名单上的条形码,它们与观察到的序列之间的2个差异(汉明距离(Hamming distance)<= 2),并根据reads数据中条形码的丰度和不正确碱基的质量值对它们进行评分。如果在此模型中,未出现在白名单中的观察到的条形码有90%的概率是真实的条形码,则将其更正为白名单条形码。

    01
    领券