【Uniapp】Uniapp Android原生插件开发指北

前言

在uniapp开发中当HBuilderX中提供的能力无法满足App功能需求,需要通过使用Andorid/iOS原生开发实现时,或者是第三方公司提供的是Android的库,这时候可使用App离线SDK开发原生插件来扩展原生能力。

插件类型有两种,Module模式和Component模式

Module模式:能力扩展,无嵌入窗体的UI控件。大部分插件都是属于此类,比如调用计步器API。代码写法为通过js进行require,然后调用该插件对象的方法。如涉及一些弹出框、全屏ui,也仍然属于Module模式。类似于前端里的js sdk。
Component模式:在窗体中内嵌显示某个原生ui组件。比如窗体局部内嵌某个地图厂商的map组件,上下混排其他前端内容,就需要把这个原生地图sdk封装为Component模式。代码写法与vue组件相同,在template里写组件标签。类似于前端里的vue组件。

本文主要讨论的是Module模式的开发。

开发环境准备

开发环境:JAVA环境 jdk1.8 和Android X
Android studio,最新的Hbuilderx,最新的离线uniSdk

插件必须在uni-sdk的基础上进行开发,可以快速的下载离线uni-sdk,导入UniPlugin-Hello-AS示例工程,也可以自己新建一个原生android项目,拷贝不要的包和资源进行开发。

开发原生插件

1、导入uni插件原生项目(离线uni-sdk中解压),并且成功编译。打开后目录如下:
在这里插入图片描述

Module插件的开发,是一个Module构建成一个插件aar,因为需要新建一个插件实现新的功能。

2、创建Module

在现有Android项目中创建library的Module。例如uniplugin_readcard,配置刚创建的Module的build.gradle信息。

//导入aar需要的配置
repositories {flatDir {dirs 'libs'}
}
dependencies {//必须添加的依赖compileOnly 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0',compileOnly 'androidx.core:core:1.1.0'compileOnly 'androidx.fragment:fragment:1.1.0'compileOnly 'androidx.appcompat:appcompat:1.1.0'compileOnly 'androidx.recyclerview:recyclerview:1.1.0'compileOnly 'com.alibaba:fastjson:1.2.83'compileOnly fileTree(include: ['uniapp-v8-release.aar'], dir: '../app/libs')
}

此处的lib aar都在APP模块下有,不需要额外的导入。uniapp-v8-release.aar是扩展module主要依赖库,必须导入此依赖库!打包成插件时候不需要打包进入这些依赖库,只需要打包进去你额外添加的依赖库。
在这里插入图片描述
在这里插入图片描述
如图,新的module下,新建两个文件,ReadModule和ReadCard_AppProxy,
如果项目需要导入so包、aar或者jar包,导入放到libs下,

在这里插入图片描述

ReadModule 是暴露于外的核心的类,需要继承于UniModule ,打包插件时候需要配置到package.json的class位置。

public class ReadModule extends UniModule  {@UniJSMethod (uiThread = true)public void showToastAAA(JSONObject options, UniJSCallback jsCallback) {Toast.makeText(mUniSDKInstance.getContext(), "Hello", Toast.LENGTH_SHORT).show();JSONObject result = new JSONObject();try {result.put("cardno", "hello");jsCallback.invoke(result);} catch (JSONException e) {throw new RuntimeException(e);}}@UniJSMethod (uiThread = true)public void showTest(UniJSCallback jsCallback) {Toast.makeText(mUniSDKInstance.getContext(), "Hello", Toast.LENGTH_SHORT).show();JSONObject result = new JSONObject();try {result.put("cardno", "hello");jsCallback.invoke(result);} catch (JSONException e) {throw new RuntimeException(e);}}@SuppressLint("MissingPermission")@UniJSMethod (uiThread = true)public void piccrequest(JSONObject options, UniJSCallback jsCallback) {TelephonyManager telephonyManager = (TelephonyManager)mUniSDKInstance.getContext().getSystemService(Context.TELEPHONY_SERVICE);if (telephonyManager != null) {Map<String,String> result = new HashMap<>();result.put("imei",  telephonyManager.getDeviceId().toString());jsCallback.invoke(result);}}

注意

1)对外暴露的方法需要添加 @UniJSMethod (uiThread = true),并且设置为public 。
2)JSONObject options可以接收uniapp传过来的数据,也可以为空。
3)jscallback回调的时候,可以用JSONObject 存放数据,回调json数据,但是某些时候回调不到,可以切换成Map。

{"name": "ReadCardModule","id": "ReadCardModule", "version": "1.0.0","description": "读卡","_dp_type":"nativeplugin","_dp_nativeplugin":{"android": {"integrateType":"aar","plugins": [{"type": "module","name": "ReadCardModule", "class": "uni.dcloud.io.uniplugin_read.ReadModule"}]}}
}

注意
1)package.json的class的路径是Module 中ReadModule 的路径
2)name、id、name可以起同一个名字,避免出现错误
3)plugins的name名字用作于uniapp中的引用。

var testModule = uni.requireNativePlugin("ReadCardModule")

3、如果项目中需要进行第三方库初始化,可以新建一个ReadCard_AppProxy 实现UniAppHookProxy并且配置到 ,即可在oncreate中进行初始化。

public class ReadCard_AppProxy implements UniAppHookProxy {@Overridepublic void onCreate(Application application) {//可写初始化触发逻辑}@Overridepublic void onSubProcessCreate(Application application) {//子进程初始化回调}
}

在UniPlugin-Hello-AS工程下 “app” Module根目录assets/dcloud_uniplugins.json文件,在hooksClass节点添加你创建实现UniAppHookProxy接口的实体类完整名称填入其中即可 (有些需要初始化操作的需求可以在此处添加逻辑,无特殊操作仅使用第一种方式注册即可无需集成UniAppHookProxy接口)

开发完成后,在gradle中进行assembleRelease,即可打包成插件的aar,

在这里插入图片描述

打包给uniapp端或者上传插件市场的文件如下,package.json就是上文所描述的配置文件,Android文件夹中,项目的so包和jar包放到libs下项目所依赖的aar和打包的插件aar放到Android目录下,资源文件放到res或者assets下。

千万不要放错位置!!
千万不要放错位置!!
千万不要放错位置!!

在这里插入图片描述
在这里插入图片描述

如此,一个基础的插件开发就算完成,理论上可以交给uniapp端进行使用。copy上面的文件夹放到nativeplugins下面,mainifest.json中原生插件选择一下,然后制作自定义基座打包,就可以进行使用了。

var myPlugin= uni.requireNativePlugin("ReadCardModule")myPlugin.piccrequest({  }, (res) => {  // 处理原生方法返回的结果  console.log('读卡结果:', res);  }, (err) => {  // 处理调用插件时发生的错误  console.error('调用插件失败:', err);  });

但是uniapp端使用插件需要自定义基座和云打包时间特别长,Android模块需要保证自己的插件没有问题,是通顺的,再给uniapp使用比较好。因此,再开发完成后,在Android studio中对uniapp进行离线打包和测试是比较重要的

uniapp插件调试

1、离线打包

对于不熟悉Android的人来说,离线打包有时候难度很大。

1)hbuilder中打包资源包。

条件准备

申请离线appkey
申请离线appkey包括两部分:生成签名证书 和 申请离线appkey

生成签名证书
dcloud官方文档:https://ask.dcloud.net.cn/article/35777

签名证书用jdk自带的工具keytool生成:

keytool -genkey -alias androidPluginKey -keyalg RSA -keysize 2048 -validity 36500 -keystore androidPluginKey.keystore

androidPluginKey是证书别名,可修改为自己想设置的字符,建议使用英文字母和数字
在这里插入图片描述

申请离线appkey

在这里插入图片描述

打包资源

在这里插入图片描述

把资源配置到Android studio项目中

把资源包复制到项目中
在这里插入图片描述

配置证书

确保appid+签名证书+应用包名都一致
在这里插入图片描述

在dcloud_control.xml填写uniappId

在这里插入图片描述

在主app中添加上插件的libary

implementation project(':uniplugin_readcard') 

注册插件
在androidStudio的assets里面新建dcloud_uniplugins.json,并注册插件信息

在这里插入图片描述

如此就完成了uniapp离线打包的配置,即可在此基础上进行调试,

每次调试时在uniapp中进行修改->打包离线资源包->替换掉Android studio中的资源包。

uniapp插件使用

在hbuilder的根目录下新建nativeplugins文件夹,把把上面的文件夹(包含lib aar等资源的)放到内部
f在这里插入图片描述

打开manifest.json进行插件的选择
在这里插入图片描述

使用插件

在项目中所需要用到的地方,引用插件,调用即可,

var myPlugin= uni.requireNativePlugin("ReadCardModule")myPlugin.piccrequest({  }, (res) => {  // 处理原生方法返回的结果  console.log('读卡结果:', res);  }, (err) => {  // 处理调用插件时发生的错误  console.error('调用插件失败:', err);  });

制作自定义基座

代码完成后,可以进行自定义基座打包,即可完成开发。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

软考教材重点内容 信息安全工程师 第1章 网络信息安全概述

第 1 章 网络信息安全概述 1.1.1 网络信息安全相关概念 狭义上的网络信息安全特指网络信息系统的各组成要素符合安全属性的要求&#xff0c;即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

Redis ——发布订阅

问题引入&#xff1a; 服务器A、B、C、D&#xff0c;客户端&#xff1a;C1&#xff0c;C2&#xff0c;C3&#xff0c;C4&#xff1b; 客户端基于集群聊天服务器的负载均衡分配&#xff1b; C1 被分配到A&#xff0c;C2 被分配到B&#xff0c;C3 被分配到C&#xff0c;C4 被分…

【网络】传输层协议TCP(下)

目录 四次挥手状态变化 流量控制 PSH标记位 URG标记位 滑动窗口 快重传 拥塞控制 延迟应答 mtu TCP异常情况 四次挥手状态变化 之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手&#xff0c;下面是四次挥手的状态变化 那么我们下面可以来验证一下CLOSE_WAIT这…

单链表专题

单链表 1. 链表的概念2. 链表的分类3. 实现无头单向非循环链表&#xff08;单链表&#xff09;3.1 单链表的声明3.2 单链表的打印3.3 尾插3.4 头插3.5 尾删3.6 头删3.7 查找3.8 在指定位置之前插入数据3.9 在指定位置之后插入数据3.10 删除指定节点3.11 销毁链表 4. 一些细节4.…

K8S篇(基本介绍)

目录 一、什么是Kubernetes&#xff1f; 二、Kubernetes管理员认证&#xff08;CKA&#xff09; 1. 简介 2. 考试难易程度 3. 考试时长 4. 多少分及格 5. 考试费用 三、Kubernetes整体架构 Master Nodes 四、Kubernetes架构及和核心组件 五、Kubernetes各个组件及功…

中国500米分辨率逐月平均EVI数据集(2000-2022)

EVI是在归一化植被指数&#xff08;NDVI&#xff09;的基础上进行改进的&#xff0c;通过卫星不同波段探测数据组合而成。EVI考虑了大气校正&#xff0c;包括大气分子、气溶胶、水汽和臭氧等因素&#xff0c;以解决NDVI容易饱和的问题。EVI的计算公式考虑了蓝光和红光波段&…

二级列表联动

介绍 本示例主要介绍了List组件实现二级联动&#xff08;Cascading List&#xff09;的场景。 该场景多用于商品种类的选择、照片不同类型选择等场景。 效果图 使用说明&#xff1a; 滑动二级列表侧控件&#xff08;点击没用&#xff09;&#xff0c;一级列表随之滚动。&…

基于matlab的人民币面额识别

本文通过分析第五版人民币的特征&#xff0c;利用纸币中央数字的特征提取和识别的方法&#xff0c;通过matlab软件实现对第五版人民币的100元、50元和20元的识别。 Matlab函数介绍 Imread 函数imread用于读取图片文件中的数据。 调用格式&#xff1a; A imread(filename,…

Docker篇(实际应用)

目录 一、MySQL 部署 1. 拉取 MySQL 镜像 2. 查看镜像 3. 创建 MySQL 容器 4. 进入 MySQL 容器,登陆 MySQL 5. 远程登陆 MySQL 6. 查看容器 IP 地址 二、tomcat 部署 1. 拉取 tomcat 镜像 2. 创建 tomcat 容器 3. 搭建 Tomcat 服务并部署 web 应用 三、Nginx 部署 …

别名路径联想设置

如何使用/进行路径提示&#xff1f; 找到jsconfig.json文件&#xff0c;如何项目中没有的话&#xff0c;自行创建 {"compilerOptions": {"paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dis…

osi七层模型

文章目录 1、网络层1、数据链路层2、以太网和mac地址3、地址解析协议(arp)1、免费arp 4、物理层1、双绞线(网线) 5、总结 1、网络层 路由器就是网络层设备&#xff0c;因为是根据目标ip报文来实现转发的&#xff0c;三层的 1、数据链路层 作用 解决了&#xff0c;ip报文在链路…

spark (算子 ) groupBykey+Map 和 reduceBykey 的区别

1&#xff09;面试题&#xff1a;groupByKeymap和reduceByKey都能实现分布式分组聚合&#xff0c;有什么区别&#xff1f; - groupByKey没有Map端聚合的操作&#xff0c;只做分组&#xff0c;必须等分区结束才能实现&#xff0c;最终map需要做整体聚合 - reduceByKey是有Map端聚…

mysql--多表查询

目录 一、联合查询 案例1&#xff0c;UNION 案例2&#xff0c;UNION ALL 二、表连接查询 &#xff08;一&#xff09;内连接 &#xff08;二&#xff09;外连接 1.左外连接 2.右外连接 3.全外连接 去重关键字 distinct 三、自连接 案例1&#xff1a; 案例2&…

【MyBatis源码】CacheKey缓存键的原理分析

文章目录 Mybatis缓存设计缓存KEY的设计CacheKey类主体CacheKey组成CacheKey如何保证缓存key的唯一性 Mybatis缓存设计 MyBatis 每秒过滤众多数据库查询操作&#xff0c;这对 MyBatis 缓存键的设计提出了很高的要求。MyBatis缓存键要满足以下几点。 无碰撞&#xff1a;必须保证…

打好“组合拳”,实现国有企业降本增效

打好“组合拳”&#xff0c;实现国有企业降本增效 在当前经济不确定性加剧、市场寒意明显的背景下&#xff0c;众多国有企业因历史积累的管理问题而陷入困境。随着经济形势的严峻&#xff0c;各行业普遍出现发展乏力的现象&#xff0c;促使企业开始重视“修炼内功”、“向内挖…

金媒婚恋相亲系统10.4择爱开源旗舰版支持微信小程和抖音小程序上架

最近大家应该注意到了&#xff0c;金媒婚恋相亲系统已经更新至最新的10.4版本了&#xff01;本人作为商业用户也已经更新至最新的旗舰版了&#xff0c;更新的内容是啥&#xff01;这个官方都有列出&#xff0c;一个方面就是更新了多端的登录逻辑和UI 和后台CRM及很多细节的优化…

新能源行业必会基础知识-----电力现货市场理论篇-----电力现货市场组织-----配套措施

新能源行业必会基础知识-----电力现货市场理论篇-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/143364261 这本书是2023年出版的&#xff0c;是当下了解国内电力市场最好的途径了。还是推荐大家买来这本书进行阅读观看&#xff0c;最好作为随身携带…

【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 061 &#xff0c;文末自助获取源码 \color{red}{T061&#xff0c;文末自助获取源码} T061&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

微服务day02

教学文档&#xff1a; 黑马教学文档 Docker Docker的安装 镜像和容器 命令解读 常见命令 案例 查看DockerHub&#xff0c;拉取Nginx镜像&#xff0c;创建并运行容器 搜索Nginx镜像&#xff1a;在 www.hub.docker.com 网站进行查询 拉取镜像&#xff1a; docker pull ngin…

MySQL 安装与配置

MySQL 安装与配置 MySQL 安装 MySQL 一般分为社区版和商业版&#xff0c;我们使用的是社区版&#xff08;因为免费&#xff09;。MySQL 安装的教程在网上有很多&#xff0c;此处就不再进行进行赘述&#xff0c;这里推荐两篇文章&#xff1a;如何在 Windows11 中安装 MySQL 8.…