uni-app 扫码优化:谈谈我是如何提升安卓 App 扫码准确率的

news2024/11/24 0:00:58

一. 前言

之前的一个项目遭到用户吐槽:“你们这个 App 扫码的正确率太低了,尤其是安卓的设备。经常性的扫码扫不出来,就算是扫出来了,也是错误的结果!”

由于之前是扫描二维码的需求,所以没有对扫描条形码做严格的测试,客户提示说是条形码扫描效率低下。随即,我用自己的手机测试了一下,在安卓手机上确实有这样的问题,扫码准确率确实是低,尤其是条形码,扫码效率慢且不准确。扫描二维码的的效率还算可以,说的过去。

同一个 API,在小程序、Android、iOS 上的也会有差异,小程序和 iOS 设备上的扫码效率也属正常,唯独 Android 的机器略显尴尬。那么本篇文章我将和大家一起看一下如何在安卓的机器上提升一下扫码正确率吧!

二. 如何优化

通过分析以上的这个问题,我们先分析一下是什么原因导致的这种异常现象:

  • 通过官方的 API 调用的扫码,是否官方就已经存在着这个问题?是否已经有了解决方案?

  • 如果是我们自己开发一个原生的插件是否能解决当先的难题?

通过以上的分析,我们分别从官方的角度和自定义的角度考虑一下这个问题的解决方案。

三. 官方优化策略

image.png

image.png

调起客户端扫码,主要使用的是uni.scanCode(OBJECT)这个 API,查看官方的 API 说明,发现也没有特殊的差异性说明,也就是说:官方认为在 App 和小程序上的支持应该是一致的。

那我们就继续在看一下是不是我们使用的参数有问题?

image.png

image.png

从上面图片可以看出,对 App 来说,能够配置影响扫码的 API 有:

  • scanType:扫码类型

  • autoDecodeCharset:是否启用自动识别字符编码功能,默认为否

  • autoZoom:是否启用自动放大,默认启用

image.png

image.png

// 调起条码扫描
uni.scanCode({
  scanType: ["qrCode", "barCode", "pdf417"],
  autoDecodeCharset: true,
  success: function (res) {
    console.log("条码类型:" + res.scanType);
    console.log("条码内容:" + res.result);
  },
});

如上代码所示:scanType 添加支持了qrCodebarCode两种类型,也就是支持二维码、条形码、PDF417条码

重新打包后测试,发现改善效果甚微,可以说是没有改变,仍然扫码效率低下。

既然,使用官方的 API 优化并没有明显的改善效果,我们考虑一下别的方式呢?比如:使用封装的原生 API 方法。

四. 自定义优化策略

经过查找资料了解到:App-vue 如果想自定义扫码,有以下几种方式:

  • 使用 Html 5+ 的 Barcode 模块管理条码(一维码和二维码)扫描识别 查看链接。

  • 自己封装一个安卓原生扫码 API:使用 zxing 插件等。

直接说明我自己的做法,采用了自定义封装的(zxing)安卓原生扫码 API,可以说是解决了扫码低下的问题: 首先,时间和精力有限,没有自己封装,而是从插件应用市场搜索到一个开发者已经封装好的扫码原生插件,直接使用的,下面通过以下几个步骤看一下是如何使用的:

1. 导入插件

将插件下载后放入 uni-app 的 nativeplugins 目录下,下载地址

image.png

image.png

2. 在 manifest.json 中配置插件

如下图所示,在 manifest.json 图形化配置菜单中点击 App 原生插件配置,选择本地插件进行配置

image.png

3. 添加权限

要使用安卓手机正常调用起摄像头进行扫码,需要添加对应的权限,这是必不可少的。

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />

4. 参数格式说明

参数名说明默认值可选值
scanType扫码类型nullPDF_417、CODE_128 等
prompt扫码提示语--
locked方向是否锁定、旋转truetrue 或 false

5. 返回格式说明

参数名参数说明
success扫码状态
scanType返回的扫码类型
result扫码结果信息

6. 使用方式

// 引入插件
const myScanCode = uni.requireNativePlugin("My-ScanCode");
// 插件配置参数
const options = {
  scanType: ["CODE_128", "QR_CODE"],
  prompt: "提示:将条形码/二维码图片对准扫描框即可自动扫描",
  locked: true,
};
// 开始扫码
myScanCode.scanCode(options, (res) => {
  if (res.success === "true") {
    // 扫码成功
  } else {
    // 扫码异常
  }
});

通过以上的几个步骤,我们就将原生扫码插件引入到我们项目中,并且配置成功后正常使用了。

image.png

image.png

五. 注意事项

由于本次优化仅限于对安卓平台的优化,我们使用的插件也是针对于安卓平台的,因此需要平台差异化编码,让代码在安卓环境下进行,其他比如小程序、iOS 环境还是继续使用uni.scanCode 这个 API

export default {
  start: function () {
    return new Promise((resolve, reject) => {
      // #ifdef APP-PLUS
      if (uni.getSystemInfoSync().platform === "android") {
        const myScanCode = uni.requireNativePlugin("My-ScanCode");
        const options = {
          scanType: ["CODE_128", "QR_CODE"],
          prompt: "提示:将条形码/二维码图片对准扫描框即可自动扫描",
          locked: true,
        };
        myScanCode.scanCode(options, (res) => {
          if (res.success === "true") {
            resolve(res.result);
          } else {
            reject(res);
          }
        });
      } else {
        uni.scanCode({
          onlyFromCamera: true,
          scanType: ["barCode", "qrCode"],
          success(res) {
            resolve(res.result);
          },
        });
      }
      // #endif
      // #ifndef APP-PLUS
      uni.scanCode({
        onlyFromCamera: true,
        scanType: ["barCode", "qrCode"],
        success(res) {
          resolve(res.result);
        },
      });
      // #endif
    });
  },
};

通过以上的差异性编码优化,就可以放心的使用了,不用担心兼容性问题了,使用方式如下:

scanCode.start().then((res) => {
  // 扫码成功后逻辑处理
});

六. 总结

以上就是之前在项目中遇到的扫码问题。虽然时隔已经很长时间了,但是目前的代码运行良好,二维码和条形码的识别能力也有个质的提升。

由于当时开发较早,插件市场的插件寥寥无几,而且后来也发现了一款更优秀的原生扫码插件,拥有更优秀且强大的识别能力和识别速度,对弱光反光模糊的二维码也具有优秀的识别能力。

后续的文章我将会继续对其它扫码插件进行说明,看一下其他优秀的扫码插件是如何使用的,敬请关注!

本文其他阅读地址

稀土掘金icon-default.png?t=O83Ahttps://juejin.cn/post/7300789760702824474微信公众号icon-default.png?t=O83Ahttps://mp.weixin.qq.com/s/3c9IafKHtokl0wxqdjzJ8A

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2109466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolov8-obb旋转目标检测onnxruntime和tensorrt推理

onnxruntime推理 导出onnx模型&#xff1a; from ultralytics import YOLO model YOLO("yolov8n-obb.pt") model.export(format"onnx") onnx模型结构如下&#xff1a; python推理代码&#xff1a; import cv2 import math import numpy as np impo…

全面提升管理效率的智慧园区可视化系统

通过图扑 HT 搭建智慧园区可视化&#xff0c;实时监测和展示园区内各设施的状态与能耗&#xff0c;优化资源配置&#xff0c;提升园区管理效率。

科普神文,一次性讲透AI大模型的核心概念

令牌&#xff0c;向量&#xff0c;嵌入&#xff0c;注意力&#xff0c;这些AI大模型名词是否一直让你感觉熟悉又陌生&#xff0c;如果答案肯定的话&#xff0c;那么朋友&#xff0c;今天这篇科普神文不容错过。我将结合大量示例及可视化的图形手段&#xff0c;为你由浅入深一次…

电脑怎么禁止软件联网?电脑怎么限制软件上网?方法很多,这三种最常用!

在日常使用电脑时&#xff0c;某些软件可能会自动联网&#xff0c;这不仅会消耗网络资源&#xff0c;还可能带来安全风险。此外企业老板考虑到公司员工可能会在工作期间访问无关软件&#xff0c;影响工作效率&#xff0c;因此&#xff0c;很多用户希望能够禁止某些软件联网&…

springboot学生社团管理系统—计算机毕业设计源码26281

目录 摘要 Abstract 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析…

C语言 10 数组

简单来说&#xff0c;数组就是存放数据的一个组&#xff0c;所有的数据都统一存放在这一个组中&#xff0c;一个数组可以同时存放多个数据。 一维数组 比如现在想保存 12 个月的天数&#xff0c;那么只需要创建一个 int 类型的数组就可以了&#xff0c;它可以保存很多个 int …

Linux网络编程IO管理

网络 IO 涉及到两个系统对象&#xff0c;一个是用户空间调用 IO 的进程或者线程&#xff0c;一个是内核空间的内核系统&#xff0c;比如发生 IO 操作 read 时&#xff0c;它会经历两个阶段&#xff1a; 等待内核协议栈的数据准备就绪&#xff1b;将内核中的数据拷贝到用户态的…

vue3 json格式化显示数据(vue3-json-viewer) 对比修改前后数据

需求&#xff1a;对比变更前后数据 npm包下载 npm install vue3-json-viewer --savemain.ts中全局引用 // json可视化 import JsonViewer from "vue3-json-viewer" import "vue3-json-viewer/dist/index.css";app.use(JsonViewer).mount("#app&quo…

鸿蒙界面开发——组件(6):属性字符串(StyledString)文本输入

属性字符串StyledString/MutableStyledString MutableStyledString继承于StyledString&#xff0c;以下统一简称StyledString。 是功能强大的标记对象&#xff0c;可用于字符或段落级别设置文本样式。 通过将StyledString附加到文本组件&#xff0c; 可以通过多种方式更改文本…

深度学习-用神经网络NN实现足球大小球数据分析软件

文章目录 前言一、 数据收集1.1特征数据收集代码实例 二、数据预处理清洗数据特征工程&#xff1a; 三、特征提取四、模型构建五、模型训练与评估总结 前言 预测足球比赛走地大小球&#xff08;即比赛过程中进球总数是否超过某个预设值&#xff09;的深度学习模型是一个复杂但有…

霍尼韦尔、书客、米家护眼大路灯怎么样?终极测评对比和护眼灯王者机型

霍尼韦尔、书客、米家护眼大路灯怎么样&#xff1f;护眼大路灯的重要性不容忽视&#xff0c;它是我们日常生活中用眼的必备工具&#xff0c;也是眼睛能够得到保护重要一环。近年来&#xff0c;护眼大路灯市场呈现出国际大牌的垄断局面&#xff0c;但这也带来了一些问题。为了争…

油猴插件录制请求,封装接口自动化参数

参考&#xff1a;如何使用油猴插件提高测试工作效率 一、背景 在酷家乐设计工具测试中&#xff0c;总会有许多高频且较繁琐的工作&#xff0c;比如&#xff1a; 查询插件版本&#xff1a;需要打开Chrome控制台&#xff0c;输入好几个命令然后过滤出版本信息。 查询模型商品&…

java设计模式day03--(结构型模式:代理模式、适配器模式、装饰者模式、桥接模式、外观模式、组合模式、享元模式)

5&#xff0c;结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“…

SpingBoot中使用Swagger快速生成接口文档

目录 一.Swagger快速上手 二.Swagger中的基本注解 三.使用Swagger进行测试 一.Swagger快速上手 Swagger是⼀个接⼝⽂档⽣成⼯具&#xff0c;它可以帮助开发者⾃动⽣成接⼝⽂档。当项⽬的接⼝发⽣变更时&#xff0c;Swagger可以实时更新⽂档&#xff0c;确保⽂档的准确性和时…

【神经网络系列(高级)】神经网络Grokking现象的电路效率公式——揭秘学习飞跃的秘密【通俗理解】

【通俗理解】神经网络Grokking现象的电路效率公式 论文地址&#xff1a; https://arxiv.org/abs/2309.02390 参考链接&#xff1a; [1]https://x.com/VikrantVarma_/status/1699823229307699305 [2]https://pair.withgoogle.com/explorables/grokking/ 关键词提炼 #Grokkin…

组合优化与凸优化 学习笔记3 凸函数

目前学到了73页 凸函数的定义&#xff1a; 人话&#xff1a;函数f的定义域是凸集&#xff08;在一般的情况下就是不能是断开的定义域&#xff08;一般的情况是1维的嘛&#xff09;&#xff0c;假如x是什么多维向量的话就是说x的取值范围是一个凸集内&#xff09;&#xff0c;并…

基于云原生向量数据库 PieCloudVector 的 RAG 实践

近年来&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;已然成为最热门的话题之一。工业界出现了各种内容生成工具&#xff0c;能够跨多种模态产生多样化的内容。这些主流的模型能够取得卓越表现&#xff0c;归功于创新的算法、模型规模的大幅扩展&#xff0c;以及海…

XXL-JOB调度中心与执行器

XXL-JOB是一个轻量级的分布式任务调度平台&#xff0c;主要由调度中心和执行器两部分组成。下面详细讲解调度中心与执行器的功能和作用。 调度中心 调度中心是XXL-JOB的核心组件&#xff0c;负责任务的调度管理。其主要功能包括&#xff1a; 任务管理&#xff1a;调度中心提供…

计算组合数:scipy.special.comb()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 计算组合数&#xff1a; scipy.special.comb() 选择题 以下代码两次输出的结果是&#xff1f; from scipy.special import comb print("【执行】print(comb(3,2))") print(comb(3…

011. Oracle-约束

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…