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…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
