手摸手教你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官网部分
- 开发者中心创建一个应用:https://dev.dcloud.net.cn/pages/app/list

- 点击应用名称进入应用,选择 离线打包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 (这里只做演示)

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

然后运行调试即可.
uniapp项目引入原生插件,打包插件
上面是开发过程,接下来就是给uniapp使用插件了. - 省事直接用之前写好的程序BluetoothPrint
首先编译插件
在android studio中

点击你自己的gradle的项目 执行assembleRelease 脚本即可在build -> outputs -> arr 下找到生成的插件
来到HBuildx 需要新建一个文件夹nativieplugins 里面是你自己的moudle名-> android (aar文件) -> lib(里面是android中引入的其他lib)

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

下面进行导入插件, 打开根目录的 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
相关文章:
手摸手教你uniapp原生插件开发
行有余力,心无恐惧 这篇技术文章写了得有两三个礼拜,虽然最近各种事情,工作上的生活上的,但是感觉还是有很多时间被浪费.还记得几年前曾经有一段时间7点多起床运动,然后工作学习,看书提升认知.现在我都要佩服那会儿的自己.如果想回到那种状态,我觉得需要有三个重要的条件. 其…...
C++进程间通信 消息队列
C进程间通信 消息队列 消息队列概述消息队列代码示例1. 创建和发送消息的程序(sender.cpp)2. 接收消息的程序(receiver.cpp) 代码解释运行步骤运行结果 消息队列概述 消息队列是一种进程间通信机制,允许一个或多个进程…...
mysql中InnoDB的统计数据
大家好。我们知道,mysql中存在许多的统计数据,比如通过SHOW TABLE STATUS 可以看到关于表的统计数据,通过SHOW INDEX可以看到关于索引的统计数据,那么这些统计数据是怎么来的呢?它们是以什么方式收集的呢?今…...
P459 包装类Wrapper
包装类的分类 1)针对八种基本数据类型相应的引用类型——包装类。 2)有了类的特点,就可以调用类中的方法。 Boolean包装类 Character包装类 其余六种Number类型的包装类 包装类和基本数据类型的相互转换 public class Integer01 {publi…...
Kong网关的负载均衡
安装java环境 查询 java安装包 196 yum list java* 安装java8197 yum install -y java-1.8.0-openjdk.x86_64 检验java8是否安装成功。198 java -version2个tomcat准备 另外一个tomcat区别在于:配置文件。conf/server.xml 启动tomcat [rootlocalhost bin]# ./…...
这是一个逗号
还不太能是句号,随想录这两个月算是给我一个学算法的开头,感慨还是挺多的,但是语文功底很差,就接着写流水账吧。 高考前想报计算机,但是那年是先报志愿后考试,家里人劝我选择更稳一点的985,又说…...
oracle tree
select * from "Test"; INSERT INTO "Test" ("id", "name", "pid") VALUES (01, 中国, 00); INSERT INTO "Test" ("id", "name", "pid") VALUES (01.01, 福建, 01); INSERT INTO…...
react-beautiful-dnd 横纵排序demo
简单导入就可以看到效果 1. 安装依赖 npm i react-beautiful-dnd 2. 纵向排序 import React, { useState } from react; import { DragDropContext, Droppable, Draggable } from react-beautiful-dnd;// 纵向排序 const reorder (list, startIndex, endIndex) > {con…...
web练习
[CISCN 2022 初赛]ezpop ThinkPHP V6.0.12LTS 反序列化漏洞 漏洞分析 ThinkPHP6.0.12LTS反序列漏洞分析 - FreeBuf网络安全行业门户 解题过程 ThinkPHP V6.0.12LTS反序列化的链子可以找到,找到反序列化的入口就行 反序列化的入口在index.php/index/test 链子 …...
模型蒸馏笔记
文章目录 一、什么是模型蒸馏二、如何蒸馏三、常见问题3.1 四、参考文献 一、什么是模型蒸馏 Hinton在NIPS2014提出了知识蒸馏(Knowledge Distillation)的概念,旨在把一个大模型或者多个模型ensemble学到的知识迁移到另一个轻量级单模型上&a…...
HAL库使用FreeRTOS实时操作系统时配置时基源(TimeBase Source)
需要另外的定时器,用systic的时候生成项目会有警告 https://blog.51cto.com/u_16213579/10967728...
如何让你的网站能通过域名访问
背景 当我们租一台云服务器,并在上面运行了一个Web服务,我们可以使用云服务器的公网IP地址进行访问,如下: 本文主要记录如何 实现让自己的网站可以通过域名访问。 买域名 可以登录腾讯云等主流公有云平台的,购买域名…...
Spring Boot + Spring Security + JWT 从零开始
Spring Boot + Spring Security + JWT 从零开始 这篇笔记中,我们将学习如何从头开始设置一个带有Spring Security的Spring Boot应用程序,它连接到一个LDAP身份验证的Spring Security身份验证提供程序,这将是即将出现的,这个连接和工作都是开箱即用的。 实际上,设置这个非…...
【busybox记录】【shell指令】rmdir
目录 内容来源: 【GUN】【rmdir】指令介绍 【busybox】【rmdir】指令介绍 【linux】【rmdir】指令介绍 使用示例: 删除空目录 - 默认 删除dirname下的所有空目录,包括因删除其他目录而变为空的目录 常用组合指令: 指令不…...
[LitCTF 2023]yafu (中级) (素数分解)
题目: from Crypto.Util.number import * from secret import flagm bytes_to_long(flag) n 1 for i in range(15):n *getPrime(32) e 65537 c pow(m,e,n) print(fn {n}) print(fc {c})n 152412082177688498871800101395902107678314310182046454156816957…...
MySQL alter 语句
ALTER TABLE user ADD COLUMN cdkey varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT CD-Key, ADD COLUMN erp_userid varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT ERP用户ID, ADD UNIQUE INDEX un…...
列表推导式(解析式)python
Python中的列表推导式(list comprehension)是一种简洁且强大的语法,用于创建新的列表。它允许你通过对现有列表中的元素进行操作或筛选来快速生成新列表。以下是列表推导式的基本语法和一些示例: 基本语法: new_list…...
YOLO-10更快、更强
YOLO-10简介 主要贡献: 无NMS的一致双分配 YOLOv10提出了一种通过双标签分配而不用非极大值抑制NMS的策略。这种方法结合了一对多和一对一分配策略的优势,提高了效率并保持了性能。 高效的网络设计 轻量化分类头:在不显著影响性能的情况下&a…...
新火种AI|寻求合作伙伴,展开豪赌,推出神秘AI项目...苹果能否突破AI困境?
作者:小岩 编辑:彩云 2024年,伴随着AI技术的多次爆火,不仅各大科技巨头纷纷进入AI赛道展开角力,诸多智能手机厂商也纷纷加紧布局相关技术,推出众多AI手机。作为手机领域的龙头老大,苹果自然是…...
MFC工控项目实例一主菜单制作
1、本项目用在WIN10下安装的vc6.0兼容版实现。创建项目名为SEAL_PRESSURE的MFC对话框。在项目res文件下添加相关256色ico格式图片。 2、项目名称:密封压力试验机 主菜单名称: 系统参数 SYS_DATA 系统测试 SYS_TEST 选择型号 TYP_CHOICE 开始试验 TES_STA…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
