uniapp安卓APP开发—电子秤冷库项目

5,209 阅读7分钟

距离2022年终总结过去了还没一个月,我又回来写文章啦!

依稀记得当时给2023年立下的flag(文章链接:再见2022,我的点点滴滴!!!),其中之一就是:完成公司的“电子秤冷库APP项目”,在大饼的诱惑下,我拼命的码功能,终于从2023.01.04 写下第一行代码,到2023.01.18,完成所有功能,并产出第一个测试版本。(当然我前期的 demo案例功能测试也为其做出了巨大贡献,极大地缩短了开发所需的时间)。

这波APP功能开发过程中,敲得我每天手都是酸的,也再次让我重新认识了自己(我真是太牛掰了!!!)。这是除了刚入行时,半个月完成150张App页面之后,又一件让我印象很深的事。

在此特意进行记录下本次开发之旅,做一下总结收获,并且希望当大家有类似需求的时候,回想起我的这篇文章能有所启迪。

技术选型

  1. HBuilderX 进行uniapp项目的搭建
  2. Android Studio进行原生插件开发,以及离线打包测试
  3. UView 进行项目页面UI搭建

所需设备

  1. 安卓屏,(安卓4.0 版本不支持;目前开发使用的安卓6.0.1)
  2. 电子秤
  3. 打印机
  4. 扫码枪

实现功能

  1. 进行商品称重、商品信息标签打印
  2. 进行商品信息录入、入库,信息查询
  3. 进行商品扫码,出库

开发过程(相关功能实现,采取的技术方案)

1. 称重、打印

在本次项目开发中,电子秤、打印机采用的是串口通讯的方式。电子秤采用RS485串口接入安卓屏,打印机采用的RS232串口接入安卓屏。
因此,这个功能的实现离不开串口通讯。主要方法:与电子秤、打印机插件要相关串口通讯资料、demo,一般这些是采用安卓开发的,有相关原生的arr,支持在原生开发中直接调用已经封装好的方法。只需要在原生Android开发中直接引入就可以了。
但是问题来了,我们采用的技术是uniapp进行安卓开发,这下应当怎么办呢!想必大家还记得我之前的文章:uniapp开发安卓原生插件,这也是我在该项目开始之前,做的技术沉淀。
我们可以采用开发安卓原生插件的方式,将电子秤、打印机相关的原生arr,封装为可以在uniapp中使用的原生插件。这样我们就可以在该项目中对电子秤、打印机随心所欲的操控了!(我真是太机智了)。

注意事项

在这里我再次强调一下原生插件过程中应当注意的事:

  1. 注意配置相关的签名
  2. 注意配置安卓包名,不能落了。

原生插件开发完毕后,我们可以在当前的项目中使用了。我们只需要在项目中添加nativeplugins目录并进行相关配置即可。(具体的操作步骤详情,请看上一篇文章:uniapp开发安卓原生插件

正常情况下,我们在运行到安卓屏中后可以完成电子秤、打印机相关的控制。那么如果我们要打包,在本机进行调试应该怎么办呢

1.1 云打包

采用云打包的形式,我们依靠HBuilder X 将我们的项目打包。在这个过程中,我们只需要输入当前应用的证书信息即可。我们可以静静的等待打包完成,由于采用了原生插件所需的时间有点长,我们可以去喝个咖啡或者吞云吐雾放松一下,回来你就会发现一切都已顺利完成!(当然如果是第一次,大概率会发现出 bug 了。不要怕,根据提示信息进行修改即可) 当时DCloud对开发者,每天可以进行云打包、制作自定义基座是有次数限制的,超额了需要花钱。作为一个勤俭持家的当代好青年,我们肯定不乐意,那么下面的:本地打包方案,就有效解决了我们的问题。

1.2 本地打包

我们采用HBuilder X 中本地打包功能,可以生成本地打包资源。然后我们可以将资源引入 官方为我们提供的 app离线sdk中的 HBuilder-Integrate-AS 中,然后在进行了配置后,可以在Android Studio中进行调试。
采用这种方案,我们可操作的空间更大,也更便于我们对一些问题的排查。

注意事项

  1. 我们要采用跟当前HBuilder X版本一致的 app离线sdk进行调试,否则会报:版本不一致,有潜在的问题
  2. 我们要提前将 sdk 总的项目配置好,签名、资源包
  3. 我们要将自主开发的原生插件导入到 lib中,并在 assets - dcloud_uniplugins.json 中进行配置
  4. 别忘了将 原生的打印机、电子秤arr也放到 lib中,否则有可能会出现异常

2. 扫码

扫码枪采用的USB连接,因此在项目中只需要在当前页面中监听 keydown 事件即可。然后将监听获取到的 keyCode 转换为对应的字符即可。

注意事项

在完成该功能进行自测阶段发现一个问题:
因为当前页面中有 input 组件,用户有可能进行了点击操作,此时 input 框聚焦,在这个时候就会出现一个现象:扫码枪获取到的值会作为输入值,输入到 input 中,这个时候页面的 keydown 监听是监听不到该行为的。
当用户取消input聚焦后,再次进行扫码操作,此时会出现:扫码枪最后一个Enter操作消失,无法获取 keyCode === 66 这个值

解决方法

思路:扫码枪造成的输入操作,所花费的时间远远小于用户输入的时间,因此可以设置个定时器,用来防止该行为的发生。

// 扫码枪输入内容
let inputValue = ''; 
// 扫码枪input定时器。防止input聚焦导致的问题
let scanTimer = null;
        
onLoad() {
    uni.showLoading({
	title: '加载中',
	mask: true
    });
			
    // 添加键盘输入的监听;防止当前input 聚焦后,再次扫码,无法触发 enter
    // #ifdef APP-PLUS
    plus.key.addEventListener("keydown", (e) => {
        if(!inputValue) {
            uni.showLoading({
                title: '扫码并获取信息中...',
                mask: true,
            })
        }
        if (e.keyCode === 66 || e.key =='Enter') {
            // 根据获取的条形码数据,获取商品信息
            clearTimeout(scanTimer);
            scanTimer = null;
            inputValue = '';
        } else {
            // keyMap 为 keyCode 对应的 字符表
            inputValue += keymap[e.keyCode];
            if(!scanTimer) {
                scanTimer = setTimeout(() => {
                    scanTimer = null;
                }, 2000)
            }
        }
    });
    // #endif 
},

3. 商品信息录入,信息查询

要实现该功能的话,我们需要采用 官方提供的 SQLite(数据库)模块,相关资料可查看:SQLite官方文档 该模块在 下载的Android 离线SDK中可以找到(注意:要使用与开发版本一致的,防止出现未知的问题。)
我们创建数据库,然后针对不同的信息、查询需要,创建对应的数据表,即可。然后根据功能,进行增删改查。在开发中,可以将于数据库的相关操作、配置都提取出来,这样便于整体项目的使用,也便于问题的排查。

至此,该项目大致功能的思路都已经介绍完毕,希望对各位有所启发!
现在天选打工人的我还在上班,明天还有一天,公司坚持不到最后一天,绝不放假。各位看我这么命苦,赶快给我点个赞,鼓励鼓励我吧!!感谢!!