uniapp—android原生插件开发(2原生插件开发)
本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求!
***环境问题移步至:uniapp—android原生插件开发(1环境准备)
一、将App离线SDK解压,并导入Android Studio中
下载地址:Android 离线SDK - 正式版 | uni小程序SDK
***强烈建议:不要不听劝,本人踩了两天坑,不然有意想不到的问题等着你解决
- 下载最新版本Android 离线SDK - 正式版,不然会出现不兼容问题。
- 最好用案例中的gradle版本,不然会出现不兼容问题。
- 包名能共用一个就共用一个,不然难的去找问题。
- 解压App离线SDK、并将UniPlugin-Hello-AS项目导入Android Studio中

- 等待编译完成,需要较长的时间(15分钟左右,根据电脑性能、网速决定)

二、新建自定义模块(uniplugin_rfid)
***强烈建议:不要不听劝,本人踩了两天坑,不然有意想不到的问题等着你解决
- 把模块名定义好。
- 把事先定义好的包名直接拿过来用(事先生成的appKey中填写的包名,此处用之前定义好的包名),当然也可以重新定义新的包名,然后再去改appKey中的包名,再重新生成appKey即可。
- 新建模块,

- 定义模块名、定义包名,生成模块

- 中途可能会因为build.gradle编译报错,直接将uniplugin_module模块下的build.gradle覆盖刚生成模块下的build.gradle,然后点击Try Again或者Sync Now

- 覆盖AndroidManifest.xml文件,并修改配置,此处会报错,会提示你新建一个java类,直接创建,然后UniModule类(必须继承UniModule,必须@UniJSMethod注解),此时AndroidManifest.xml还会报错,按照提示修复即可变成同样的结构。

- 创建RfidModule类,如果上一步已创建则忽略此步骤
注意:必须继承UniModule,必须@UniJSMethod注解

- 添加测试方法:
package com.recognition.uniplugin_rfid;import android.content.Context;
import android.util.Log;import com.alibaba.fastjson.JSONObject;
import com.nlscan.uhf.lib.UHFReader;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;public class RfidModule extends UniModule {// 使用UniJSMethod注解,才能使用js调用@UniJSMethod(uiThread = false)public void add(JSONObject json, UniJSCallback callback) {final int a = json.getInteger("a");final int b = json.getInteger("b");callback.invoke(new JSONObject() {{put("code", 0);put("result", a + b);}});}private MyUhfManager uhfManager;// 初始化UHF设备@UniJSMethod(uiThread = false)public void initialize(Context context) {if (context != null) {uhfManager = uhfManager.getInstance(context.getApplicationContext());} else {Log.e("UHFPlugin", "Context is null, using application context instead.");uhfManager = uhfManager.getInstance(context.getApplicationContext());}}// 连接UHF设备@UniJSMethod(uiThread = false)public boolean connect() {if (uhfManager != null) {final CountDownLatch latch = new CountDownLatch(1);final boolean[] isConnected = {false};uhfManager.powerOn(result -> {isConnected[0] = result;latch.countDown(); // 回调完成时释放锁});try {// 等待回调完成(设定超时以防止无尽等待)latch.await(5, TimeUnit.SECONDS);} catch (InterruptedException e) {e.printStackTrace();}return isConnected[0];}return false;}// 断开连接@UniJSMethod(uiThread = false)public boolean disconnect() {if (uhfManager != null && uhfManager.isPowerOn()) {// 假设调用 stopInventory 后达到断开效果UHFReader.READER_STATE stopInventoryState = uhfManager.stopInventory();// 如果有设置功率的方法,也可以尝试将功率设为零来模拟断开uhfManager.setReadPower(0, result -> {// 此处 result 用于表示功率设为0是否成功});// 检查 stopInventory 的状态是否成功return stopInventoryState == UHFReader.READER_STATE.OK_ERR;}return false;}// 启动盘点@UniJSMethod(uiThread = false)public boolean startInventory() {if (uhfManager != null) {UHFReader.READER_STATE state = uhfManager.startInventory();return state == UHFReader.READER_STATE.OK_ERR;}return false;}// 停止盘点@UniJSMethod(uiThread = false)public boolean stopInventory() {if (uhfManager != null) {UHFReader.READER_STATE state = uhfManager.stopInventory();return state == UHFReader.READER_STATE.OK_ERR;}return false;}// 读取标签数据@UniJSMethod(uiThread = false)public String readTagData(int bank, int address, int blkcnt, String accessPassword) {if (uhfManager != null) {byte[] data = uhfManager.getDataByArea(bank, accessPassword, blkcnt);return data != null ? UHFReader.bytes_Hexstr(data) : null;}return null;}// 写入标签数据到EPC区@UniJSMethod(uiThread = false)public boolean writeTagDataToEPC(String data, String accessPassword) {if (uhfManager != null) {final CountDownLatch latch = new CountDownLatch(1);final boolean[] writeSuccess = {false};uhfManager.writeDataToEPC(data, accessPassword, (result, state) -> {writeSuccess[0] = result; // 将回调结果存储到数组中latch.countDown(); // 回调完成时释放锁});try {// 等待回调完成(设置超时防止阻塞)latch.await(5, TimeUnit.SECONDS);} catch (InterruptedException e) {e.printStackTrace();}return writeSuccess[0]; // 返回写入操作的结果}return false;}// 写入标签数据到用户区@UniJSMethod(uiThread = false)public boolean writeTagDataToUser(String data, String accessPassword) {if (uhfManager != null) {final CountDownLatch latch = new CountDownLatch(1);final boolean[] writeSuccess = {false};uhfManager.writeDataToUser(data, accessPassword, (result, state) -> {writeSuccess[0] = result; // 将回调结果存储到数组中latch.countDown(); // 回调完成时释放锁});try {// 等待回调完成(设置超时防止阻塞)latch.await(5, TimeUnit.SECONDS);} catch (InterruptedException e) {e.printStackTrace();}return writeSuccess[0]; // 返回写入操作的结果}return false;}}
三、将自定义插件添加到unapp插件中
- 在app中的build.gradle中添加自定义插件模块

- 在app中的dcloud_uniplugin.json添加自定义插件暴露的方法

编译通过即可,下一步进行真机调试。
快速通道:
uniapp—android原生插件开发(1环境准备)
uniapp—android原生插件开发(3Android真机调试)
相关文章:
uniapp—android原生插件开发(2原生插件开发)
本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求! ***环境问题移步至:uniapp—an…...
NLP之ASR之moonshine:moonshine的简介、安装和使用方法、案例应用之详细攻略
NLP之ASR之moonshine:moonshine的简介、安装和使用方法、案例应用之详细攻略 目录 moonshine的简介 moonshine的安装和使用方法 1、安装 推荐使用uv管理Python环境 安装Moonshine包 Torch后端 TensorFlow后端 JAX后端 ONNX运行时 2、使用方法 0、测试 1…...
albert模型实现微信公众号虚假新闻分类
项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…...
OceanBase 应用实践:如何处理数据空洞,降低存储空间
问题描述 某保险行业客户的核心系统,从Oracle 迁移到OceanBase之后,发现数据存储空间出现膨胀问题,数据空间 datasize9857715.48M,实际存储占用空间17790702.00M。根据 required_mb - data_mb 值判断,数据空洞较为严重…...
计算机的错误计算(一百四十八)
摘要 本节探讨 MATLAB 中 附近数的正割函数与 附近数的余割函数的计算精度问题。 例1. 已知 计算 直接贴图吧: 另外,16位的正确值分别为 0.4105556037464873e9、0.3670813182326778e13、-0.2549029285657875e8 与 -0.1248777628817462e12&am…...
MySQL记录锁、间隙锁、临键锁(Next-Key Locks)详解
行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。 应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。 对于行…...
SLM401A系列42V商业照明线性恒流芯片 线性照明调光在LED模组及灯带智能球泡灯上应用
SLM401A系列型号选型: SLM401A10ED-7G:QFN1010-4 SLM401A15aa-7G:SOT23-3 SLM401A20aa-7G:SOT23-3 SLM401A20ED-7G:QFN1010-4 SLM401A25aa-7G:SOT23-3 SLM401A30aa-7G:SOT23-3 SLM401A40aa-7G:SOT23-3 SLM401A50aa-7G:SOT23-3 SLM401A6…...
京东零售推荐系统可解释能力详解
作者:智能平台 张颖 本文导读 本文将介绍可解释能力在京东零售推荐系统中的应用实践。主要内容包括以下几大部分:推荐系统可解释定义、系统架构、排序可解释、模型可解释、流量可解释。 推荐系统可解释定义 推荐系统可解释的核心包括三部分࿰…...
蓝桥杯 懒洋洋字符串--字符串读入
题目 代码 #include <iostream>using namespace std;int main(){int n;cin>>n;char s[210][4];int ans0;for(int i0;i<n;i){scanf("%s",s[i]);}for(int i0;i<n;i){char as[i][0];char bs[i][1];char cs[i][2];// cout<<a<< <<b…...
SDL打开YUV视频
文章目录 问题1:如何控制帧率?问题2:如何触发退出事件?问题3:如何实时调整视频窗口的大小问题4:YUV如何一次读取一帧的数据? 问题1:如何控制帧率? 单独用一个子线程给主线…...
微服务架构面试内容整理-Archaius
Archaius 是由 Netflix 开发的一个配置管理库,主要用于处理动态配置和环境配置。在微服务架构中,Archaius 允许开发者以灵活的方式管理配置,从而更好地应对变化的需求。以下是 Archaius 的主要特点、工作原理和使用场景: 主要特点 1. 动态配置: Archaius 支持动态更新配置…...
实现 Nuxt3 预览PDF文件
安装必要的库,这里使用PDF.js库 npm install pdfjs-dist --save 为了解决跨域问题,在server/api 下 创建一个请求api, downloadFileByProxy.ts import { defineEventHandler } from h3;export default defineEventHandler(async event >…...
udp为什么会比tcp 有更低的延迟
UDP(User Datagram Protocol,用户数据报协议)相比TCP(Transmission Control Protocol,传输控制协议)具有更低的延迟,这主要归因于UDP协议的设计特点和机制。以下是对UDP比TCP延迟低的原因的详细…...
基于java+SpringBoot+Vue的洗衣店订单管理系统设计与实现
项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven mysql5.7或8.0等等组成&#x…...
HarmonyOS-消息推送
一. 服务简述 Push Kit(推送服务)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。所有HarmonyOS 应用可通过集成 Push Kit,实现向应用实时推送消息,使消息易见,构筑良好的用户关系࿰…...
数据分析:宏基因组DESeq2差异分析筛选差异物种
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理:计算步骤:结果:加载R包准备画图主题数据链接导入数据Differential abundance (No BP vs 2BP TA)构建`countData`矩阵过滤低丰度物种构建DESeq数据对象DESeq2差异分析画图Di…...
出海企业如何借助云计算平台实现多区域部署?
云计算de小白 如需进一步了解,请单击链接了解有关 Akamai 云计算的更多信息 在本文中我们将告诉大家如何在Linode云计算平台上借助VLAN快速实现多地域部署。 首先我们需要明确一些基本概念和思想: 部署多区域 VLAN 为了在多区域部署中在不同的 VLAN …...
硬件---1电路设计安全要点以及欧姆定律
前言: 一直搞的东西都偏软件,硬件也一直在学,元器件、基础电路知识、PCB设计、模电运放都学的马马虎虎,因此决定进行系统性学习,内容基本来源于手里的视频和书本以及自己的感悟。 一电路安全 1电路安全 在初期基础…...
Linux如何更优质调节系统性能
一、硬件优化 增加物理内存:最直接的提升系统性能的方法。内存不足时,系统会频繁进行交换(swapping)活动,这会显著降低系统的响应速度,因为磁盘IO速度远低于内存访问速度。通过增加内存,可以减…...
第三十五章 Vue路由进阶之声明式导航(跳转传参)
目录 一、引言 二、查询参数传参 2.1. 使用方式 2.2. 完整代码 2.2.1. main.js 2.2.2. App.vue 2.2.3. Search.vue 2.2.4. Home.vue 2.2.5. index.js 三、动态路由传参 3.1. 使用方式 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vue 3.2.3. Search.vue 3.2.4. Hom…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
