uniapp—android原生插件开发(2原生插件开发)

本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求!

***环境问题移步至:uniapp—android原生插件开发(1环境准备)

一、将App离线SDK解压,并导入Android Studio中

下载地址:Android 离线SDK - 正式版 | uni小程序SDK

***强烈建议:不要不听劝,本人踩了两天坑,不然有意想不到的问题等着你解决

  1. 下载最新版本Android 离线SDK - 正式版,不然会出现不兼容问题。
  2. 最好用案例中的gradle版本,不然会出现不兼容问题。
  3. 包名能共用一个就共用一个,不然难的去找问题。
  • 解压App离线SDK、并将UniPlugin-Hello-AS项目导入Android Studio中

           

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

二、新建自定义模块(uniplugin_rfid)

***强烈建议:不要不听劝,本人踩了两天坑,不然有意想不到的问题等着你解决

  1. 把模块名定义好。
  2. 把事先定义好的包名直接拿过来用(事先生成的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真机调试)

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

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

相关文章

【机器学习】强化学习(1)——强化学习原理浅析(区分强化学习、监督学习和启发式算法)

文章目录 强化学习介绍强化学习和监督学习比较监督学习强化学习 强化学习的数学和过程表达动作空间序列决策策略(policy)价值函数(value function)模型(model) 强化学习和启发式算法比较强化学习步骤代码走…

常见 HTTP 状态码分类和解释及服务端向前端返回响应时的最完整格式

目前开发的项目很大程度上是为明年的国产化做准备了,所以借这个机会把用了十年的自研系统全部重写,订立更严格的规范,本文记录一下返回格式及对应状态码。 常见 HTTP 状态码及解释 HTTP 状态码用于表示客户端请求的响应状态,它们…

深入理解JVM

文章目录 1. JVM内存区域划分2. JVM中类加载过程类加载(1)类加载的基本流程(2)双亲委派模型 《深入理解java虚拟机》 在这本书前,面试官对于JVM也不是很了解。 这本书主要还是写个一下开发 JVM 的人。 1. JVM内存区域…

启动软件是用例吗

沙亚雄 2020-8-13 14:06 潘老师,你好,最近读了您的软件方法,结合自己的项目发现始终有一个疑问?那就是启动软件算不算一个用例,因为软件在启动的时候一般都要实例化一些对象,读一些配置文件等等。那启动软…

Ubuntu22.04中使用CMake配置运行boost库示例程序

Ubuntu22.04中使用CMake配置运行boost库示例程序 boost是一个比较强大的C准标准库,里面有很多值得学习的东西,比较asio网络库可以用来编写C TCP客户端或者TCP服务端接收程序。本文主要讲解如何在Ubuntu22.04中使用Cmake配置boost库,以及运行…

指标+AI+BI:构建数据分析新范式丨2024袋鼠云秋季发布会回顾

10月30日,袋鼠云成功举办了以“AI驱动,数智未来”为主题的2024年秋季发布会。大会深度探讨了如何凭借 AI 实现新的飞跃,重塑企业的经营管理方式,加速数智化进程。 作为大会的重要环节之一,袋鼠云数栈产品经理潮汐带来了…

Windows配置NTP时间同步

Windows下实现NTP时间同步 1、Windows时间服务(W32Time)2、Windows 时间同步的工作原理3、配置和管理 Windows 时间同步3.1 命令行工具:w32tm3.2 控制面板中的设置 4. 高级设置(Windows Server 环境)5.调整时间同步的间隔5.1 通过组策略调整时…

系统安全第七次作业题目及答案

一、 1.RBAC0 RBAC1 RBAC2 RBAC3 2.属性 身份标识 3.接入访问控制 资源访问控制 网络端口和节点的访问控制 二、 1.B 2.A 3.ABE 4.BCD 5.ABC 三、 1. 答:基于属性的访问控制(ABAC)是通过对实体属性添加约束策略的方式实现主、客体之…

Golang进阶

1.面向对象 1.1.golang语言面向对象编程说明 Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说 Golang 支持面向对象编程特性是比较准确的。Golang 没有类(class),Go 语言的结构体(st…

Node(节点)、Menu(菜单) 和 Tab(标签页)之间的关系

在系统开发中,尤其是在涉及到前端界面设计和后台管理系统时,我们经常会看到 Node(节点)、Menu(菜单) 和 Tab(标签页) 这几个概念。这些概念有不同的用途和功能,理解它们之…

Python数据分析案例64——杭帮菜美食探索数据分析可视化

案例背景 杭州是真没啥美食呀.....但是 总是还是有好吃的店家,于是就发挥专业长处,进行一下分析,看看杭帮菜的一些特点。。例如看看品种分布啊,类型分布啊,行政区的分布啊,店铺评分的一些分布啊&#xff0…

基于SSD模型的路面坑洼检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于SSD模型的路面坑洼检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili (一)简介 基于SSD模型的路面坑洼检测系统是在 Py…

《Python编程实训快速上手》第四天--字符串操作

一、处理字符串 1、单引号和双引号 Python中单双引号均可以表示字符串,区别在于: 1、双引号中可以使用到单引号 2、单引号字符串中如果要使用单引号,要使用到转义字符 \ \ \t \n \\ 原始字符串 在开始的引号前加r&#xf…

泷羽sec学习打卡-Windows基础命令

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于windows的那些事儿-Base 一、Windows-BaseWindows有哪些版本呢,有什么区别呢&#xff1f…

Node.js——fs模块-文件夹操作

1、借助Node.js的能力,我们可以对文件夹进行创建、读取、删除等操作 2、方法 方法 说明 mkdir/mkdirSync 创建文件夹 readdir/readdirSync 读取文件夹 rmdir/rmdirSync 删除文件夹 3、语法 其余的方法语法类似 本文的分享到此结束,欢迎大家评论区…

VMware Fusion和centos 8的安装

资源 本文用到的文件:centos8镜像 , VMware 软件包 , Termius 文件链接: https://pan.baidu.com/s/1kOES_ZJ8NGN-BnJl6NC7Sg?pwd63ct 安装虚拟机 先 安装 vmware ,然后打开,将下载的 iso 镜像拖入 拖入镜像文件iso Continue, 然后随便选…

【嵌入式开发——ARM】1ARM架构

嵌入式领域,使用ARM架构的芯片公司可不占少数吧,intel的x86架构主要占据PC、服务器市场,ARM架构主要占据移动市场。x86架构和ARM架构不同的主要原因,是背后使用的计算机指令集不同。计算机有自己的语言系统(汇编&#…

LabVIEW扫描探针显微镜系统

开发了一套基于LabVIEW软件开发的扫描探针显微镜系统。该系统专为微观尺度材料的热性能测量而设计,特别适用于纳米材料如石墨烯、碳纳米管等的研究。系统通过LabVIEW编程实现高精度的表面形貌和热性能测量,广泛应用于科研和工业领域。 项目背景 随着纳…

JavaScript day01 笔记

一、引入方式 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。通过 script 标签将 JavaScript 代码引入到 HTML 中 1️⃣内部 通过 script 标签包裹 JavaScript 代码&#xff08;一般就写在</script>的…

【Git】Liunx环境下Git的使用:“克隆,提交,推送“

目录 一、常用参数 二、我们为什么要使用Git&#xff1f; 三、创建远程仓库 第一步&#xff1a;创建对应代码托管平台账号。 第二步&#xff1a;在托管平台创建仓库 第三步&#xff1a;完善仓库内容&#xff08;选择性使用&#xff09; 开源和私有 四、克隆远程仓库到本…