当前位置: 首页 > news >正文

手摸手教你uniapp原生插件开发

行有余力,心无恐惧

这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件.

其一: 目标,需要设定一个自己的目标. 那时候我在网上花不少钱买了课程,想提升自己的技术,刚好内容又可以运用到工作中,于是干劲满满,有了目标,并且有反馈,进步就比较大.所以需要设定一个可实现的目标,不论是短期还是长期.
其二. 环境.需要有一个能够保持学习热情的环境.当时住的离公司比较近,通勤时间少,这样就能保存自己的精力,另外回家后没有电脑,这样也减少了电子产品对人的诱惑,没电脑玩就看书,也正是那时候看到房东的那本<囚徒健身>才让我开启锻炼.孟母三迁也是这个道理,所以一个好的环境对人影响很大. 最近情绪有些低落,杂念较多,后面换个住的环境,看看能否改善把.
其三. 心态.说是条件,倒不如说是当时的状态.比较焦虑.未雨绸缪,居安思危是我的习惯,我总是担心10年20年甚至更久远将会发生的一些事情,这样就会让人焦虑,但这也是动力,它会让人去行动.后来通过看书,了解到一个方法,就是把自己的焦虑具体化,把担忧的事情写到纸上,诚恳面对自己的焦虑,面对这些未来可能发生的事情,自己能否承担的住.可以承受那最好,承受不住则去行动,让自己战胜焦虑. 所以需要积极的调整心态,张弛有度,保持平静和坚定.

总结下就是:
定好目标,打造环境,主动休息.
昨天在集思录上看到一段话,也是我希望做到的,那便是: “行有余力,心无恐惧”

文章目录

  • 背景:
  • 开发步骤:
    • uniapp官网部分
    • android部分
    • uniapp部分
      • uniapp引入插件
      • 打包资源
    • uniapp项目引入原生插件,打包插件
      • 首先编译插件
      • 打包自定义基座

背景:

目前在利用uniapp开发应用,主要是做打印功能,我们是SDK,需要把打印的功能提供给开发者. 但是目前打印图片的时候遇到一个问题,选择图片后,利用uniapp的api把图片绘制到界面上,如下api

uni.createCanvasContext(canvasId, this)

然后通过

uni.canvasGetImageData(OBJECT,this)

这个方法是返回一个byte数组,用来描述 canvas 区域隐含的像素数据. 在获取图片像素的时候数据不对,导致打印出来的数据很模糊. uniapp的bug 反馈了也没解决.插件市场上也没有适合我们的这的功能. 没办法只能利用原生插件区处理获取图片的byte数据了.

  • 流程是 uniapp->调用android原生代码-> 返回uniapp需要的数据

开发步骤:

官方文档 https://nativesupport.dcloud.net.cn/NativePlugin/course/android.html
官方文档我感觉写的比较杂乱,并非按照开发顺序来的. 我自己再梳理一下,以android开发者角度,从零开发的经验去做uniapp原生插件

uniapp官网部分

  1. 开发者中心创建一个应用:https://dev.dcloud.net.cn/pages/app/list

  1. 点击应用名称进入应用,选择 离线打包Key管理 ,

打底

输入啥都填上
3. 把key什么的都记住

android部分

https://nativesupport.dcloud.net.cn/AppDocs/download/android.html

注意这里下载的离线sdk需要和HbuilderX的版本对应 要不然会出错

离线sdk内有案例工程. UniPlugin-Hello-AS 导入到android studio 内

  • 点击Android Studio菜单选项File—>New—>Import Project。

UniPlugin-Hello-AS 把这个项目打开

示例代码有三种不同类型的组件, 我这种情况时候moudle这种模式. 这种也是使用最频繁的模式

仿照示例代码自己创建一个android的moudle

  • 点击Android Studio菜单选项File—>New—>New Moudle 。

注意 你的gradle编译版本可能和uniplugin的编译版本不一致, 所有把示例项目中的gradle 直接拷贝到你新建的library去, manifest同理. 记得把包名改为自己的.

把刚才在官网上申请的appkey填写到 app/src/main/AndroidManifest.xml 中

就是在这里

 <meta-dataandroid:name="dcloud_appkey"android:value="开发者需登录https://dev.dcloud.net.cn/申请签名" />

记得把自己的证书放到项目里, 我们是安卓开发程序员就不多赘述了.

新建一个类,里面是自己的业务逻辑,我这里也直接拷贝官方的demo, 不过我把跳转activity的逻辑删除了.少一些操作.

uniapp部分

uniapp引入插件

	const PluginName = uni.requireNativePlugin(PluginName); // PluginName 为原生插件名称

然后调用 调用具体可以看官方文档 或者看下底部的其他资料参考

打包资源

选择本地打包资源

图片

复制打包资源到android插件项目

  • 大家一定要注意.复制的时候千万注意包名.千万不能直接拷贝到AS里面, 包名路径变化了. 我在这里被耽误了很长时间,经过排查才发现直接拷贝到as内,包名路径不对. 所以要从文件夹内复制才行

修改插件dcloud_uniplugins.json 文件, 指定自己的moudle (这里只做演示)

img2

同理, 这里的ID 也改为你 HBuilderX内Uniapp项目内的ID

image.png

然后运行调试即可.

uniapp项目引入原生插件,打包插件

上面是开发过程,接下来就是给uniapp使用插件了. - 省事直接用之前写好的程序BluetoothPrint

首先编译插件

在android studio中

点击你自己的gradle的项目 执行assembleRelease 脚本即可在build -> outputs -> arr 下找到生成的插件

来到HBuildx 需要新建一个文件夹nativieplugins 里面是你自己的moudle名-> android (aar文件) -> lib(里面是android中引入的其他lib)

ddkk

下面需要新建描述文件 就是package.json

jj

下面进行导入插件, 打开根目录的 manifast.json 文件 进行导入

打包自定义基座

公共证书, 自由证书,云端证书都行 随意 我用的公共证书

打包好后就可以运行自定义基座了

end

大家结合看参考资料

其他参考资料

https://nativesupport.dcloud.net.cn/NativePlugin/course/android.html

https://nativesupport.dcloud.net.cn/NativePlugin/course/package.html

https://blog.csdn.net/Douz_lungfish/article/details/126270135

https://zh.uniapp.dcloud.io/plugin/native-plugin.html

https://blog.csdn.net/haduwi/article/details/124422976

相关文章:

  • 【ai】livekit:Agents 3 : pythonsdk和livekit-agent的可编辑模式下的安装
  • 朋友圈定时发送设置
  • 华发股份:加强业务协同 新政下项目热销
  • Go语言 gRPC 简述
  • 2018 年山东省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书
  • 如何从异步调用中返回响应
  • new CCDIKSolver( OOI.kira, iks ); // 创建逆运动学求解器
  • internvl-chat部署
  • 效果炸裂!使用 GPT-4o 快速实现LLM OS
  • Linux源码编译安装MySQL + Qt连接MySQL
  • 告别虚拟机,在Windows10启动Linux子系统
  • C#面:DataReader与Dataset有什么区别
  • AI Agent智能体概述及原理
  • Android Dialog软键盘弹出问题完美解决办法
  • 自然语言处理(NLP)中的迁移学习
  • [译]Python中的类属性与实例属性的区别
  • CentOS7 安装JDK
  • django开发-定时任务的使用
  • express.js的介绍及使用
  • jdbc就是这么简单
  • JS实现简单的MVC模式开发小游戏
  • mysql常用命令汇总
  • quasar-framework cnodejs社区
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 闭包,sync使用细节
  • 从重复到重用
  • 跨域
  • 扑朔迷离的属性和特性【彻底弄清】
  • 我感觉这是史上最牛的防sql注入方法类
  • 小程序开发中的那些坑
  • puppet连载22:define用法
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # Apache SeaTunnel 究竟是什么?
  • (+4)2.2UML建模图
  • (160)时序收敛--->(10)时序收敛十
  • (6)STL算法之转换
  • (十五)使用Nexus创建Maven私服
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET 8.0 发布到 IIS
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Framework 3.5安装教程
  • .NET 发展历程
  • .netcore如何运行环境安装到Linux服务器
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net连接oracle数据库
  • .NET运行机制
  • /boot 内存空间不够
  • @JsonFormat与@DateTimeFormat注解的使用
  • [04]Web前端进阶—JS伪数组
  • [Android]RecyclerView添加HeaderView出现宽度问题