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

2024-09-06 16:04

本文主要是介绍uni-app 扫码优化:谈谈我是如何提升安卓 App 扫码准确率的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 前言

之前的一个项目遭到用户吐槽:“你们这个 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-PLUSif (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-PLUSuni.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

这篇关于uni-app 扫码优化:谈谈我是如何提升安卓 App 扫码准确率的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142467

相关文章

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

MySQL中慢SQL优化方法的完整指南

《MySQL中慢SQL优化方法的完整指南》当数据库响应时间超过500ms时,系统将面临三大灾难链式反应,所以本文将为大家介绍一下MySQL中慢SQL优化的常用方法,有需要的小伙伴可以了解下... 目录一、慢SQL的致命影响二、精准定位问题SQL1. 启用慢查询日志2. 诊断黄金三件套三、六大核心优化方案方案

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、