背景

项目使用到了RFID射频手持设备(PDA),用于读取羊只耳标功能。 原来有写过一个插件 https://ext.dcloud.net.cn/plugin?id=5246,新的设备与原来的不一样,所以需要重新写一遍。

之前没有记录,这次重新记录下过程。

使用的硬件设备Demo 为: uhfg_v2.2.10;

资料

1.原生插件开发资料官方:

nativesupport.dcloud.net.cn/NativePlugi…

步骤

1.下载App离线SDK及demo导入

nativesupport.dcloud.net.cn/AppDocs/dow… 下载后有对应的工程文件,需要使用Android Studio导入。

我下载的是 3.5.0,目录结构是:

导入后目录结构是这样的:

我做的项目是使用原生的扫描耳标的能力,不需要界面,所以插件是 扩展 Module 的形式。

2.新建module uhfg模块

3.导入uhf的库及配置build.gradle

uhfg模块 的build.gradle

 plugins {id 'com.android.library'
}android {signingConfigs {release {}}compileSdkVersion 30defaultConfig {minSdkVersion 21targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"consumerProguardFiles "consumer-rules.pro"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}
repositories {flatDir {dirs 'libs'}
}dependencies {
// implementation 与 compileOnly在编译时候有区别compileOnly fileTree(dir: 'libs', include: ['*.jar'])compileOnly fileTree(dir: '../app/libs', include: ['uniapp-v8-release.aar'])compileOnly 'androidx.recyclerview:recyclerview:1.1.0'compileOnly 'androidx.legacy:legacy-support-v4:1.0.0'compileOnly 'androidx.appcompat:appcompat:1.2.0'implementation 'com.alibaba:fastjson:1.1.46.android'implementation 'com.facebook.fresco:fresco:1.13.0'//implementation files('libs/reader.jar')
//implementation files('libs/ModuleAPI_J.jar')
//implementation files('libs/UHF67_v1.0.3.jar')
//implementation files('libs/App_Demo_API.jar')
//implementation files('libs/DeviceAPIver20150204.jar')
//implementation files('libs/logutil-1.5.1.1.jar')}

4.编写工具类

UHFGUtil.java

package com.nmbaiyun.yangrong.uhfg;import android.os.Handler;
import android.util.Log;import com.handheld.uhfr.UHFRManager;
import com.uhf.api.cls.Reader;import java.util.HashSet;
import java.util.List;
import java.util.Set;import cn.pda.serialport.Tools;// 单例模式,确保不多次初始化manager
public class UHFGUtil {private static UHFGUtil instance = new UHFGUtil();//获取唯一可用的对象public static UHFGUtil getInstance(){return instance;}private UHFGUtil(){initManager();}public UHFRManager manager;//uhfpublic void initManager(){if(manager == null){manager = UHFRManager.getInstance();}else{Log.e("UHFRUntil","UHFRManager 已经被初始化了!");}}public void close(){manager.close();}//3次汇总统计public void count(UHFGUtilListenner listenner, int delys){Log.e("UHFRUntil","开始计数");if (delys == 0){delys = 1000;}int times = 0;Set<String> allDevices = new HashSet<String>();while (times <3){times +=1;manager.asyncStartReading();try {int finalTimes = times;new Handler().postDelayed(new Runnable() {@Overridepublic void run() {
//tagInventoryByTimerList<Reader.TAGINFO> list = manager.tagInventoryRealTime();
//Log.i("scan", list.size()+"__"+list1.size()+"__"+list2.size());manager.asyncStopReading();if(list.size()>0){Log.i("scan", list.get(0).toString());for (Reader.TAGINFO tfs : list) {byte[] epcdata = tfs.EpcId;String data = Tools.Bytes2HexString(epcdata, epcdata.length);allDevices.add(data);
//int rssi = tfs.RSSI;
//Message msg = new Message();
//msg.what = 1;
//Bundle b = new Bundle();
//b.putString("data", data);
//b.putString("rssi", rssi + "");
//msg.setData(b);
//
//datas += k + ".设备数据是:"+data+""+rssi+"\r\n";
//k++;}}if (finalTimes >= 3 && listenner != null){listenner.callBackResult(allDevices.size(),allDevices);}}},delys);}catch (Exception e){manager.asyncStopReading();}}}//获取一组耳标public void getRFIDs(UHFGUtilListenner listenner){manager.asyncStartReading();Set<String> allDevices = new HashSet<String>();try {new Handler().postDelayed(new Runnable() {@Overridepublic void run() {
//tagInventoryByTimerList<Reader.TAGINFO> list = manager.tagInventoryRealTime();
//Log.i("scan", list.size()+"__"+list1.size()+"__"+list2.size());manager.asyncStopReading();if(list.size()>0){Log.i("scan", list.get(0).toString());for (Reader.TAGINFO tfs : list) {byte[] epcdata = tfs.EpcId;String data = Tools.Bytes2HexString(epcdata, epcdata.length);allDevices.add(data);
//int rssi = tfs.RSSI;
//Message msg = new Message();
//msg.what = 1;
//Bundle b = new Bundle();
//b.putString("data", data);
//b.putString("rssi", rssi + "");
//msg.setData(b);
//
//datas += k + ".设备数据是:"+data+""+rssi+"\r\n";
//k++;}}if ( listenner != null){listenner.callBackResult(allDevices.size(),allDevices);}}},500);}catch (Exception e){manager.asyncStopReading();}}/** * * @return * @throws InterruptedException */public String getSyncRFID() {String data = "";try{manager.asyncStartReading();Thread.sleep(300);List<Reader.TAGINFO> list = manager.tagInventoryRealTime();if(list.size()>0) {Log.i("getSyncRFID", list.get(0).toString());for (Reader.TAGINFO tfs : list) {byte[] epcdata = tfs.EpcId;data = Tools.Bytes2HexString(epcdata, epcdata.length);}}manager.asyncStopReading();return data;}catch (Exception e){Log.e("getSyncRFID",e.getMessage());return data;}}//获取设备读写功率/** * 获取设备读写功率,功率越大越费电,可监测范围越远 * @return */public String getPower(){int [] result = manager.getPower();if(result != null){return "读功率:"+result[0]+" 写功率:"+result[1];}return "获取失败";}/** * 设置设备读写功率 * @param readPower 5~30 * @param writePower 5~30 * @return */public Boolean setPower(int readPower, int writePower){Reader.READER_ERR err = manager.setPower(readPower,writePower);return err == Reader.READER_ERR.MT_OK_ERR;}}

UHFGUtilListenner.java

package com.nmbaiyun.yangrong.uhfg;import java.util.Set;public interface UHFGUtilListenner {public void callBackResult(int num, Set<String> list);
}

5.编写model类

package com.nmbaiyun.yangrong.uhfg;import android.util.Log;import com.alibaba.fastjson.JSONObject;import java.util.Set;import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;public class UHFGUtilModule extends UniModule {String TAG = "UHFGUnitModule";public static int REQUEST_CODE = 1000;
//计数中boolean isCounting = false;@UniJSMethod(uiThread = false)public void getSyncRFID(UniJSCallback callback) {if(callback != null) {String rfid = "";JSONObject data = new JSONObject();try {UHFGUtil until = UHFGUtil.getInstance();rfid = until.getSyncRFID();data.put("code", "200");data.put("data",rfid);callback.invoke(data);}catch (Exception e){data.put("code", "400");data.put("msg","异常"+e.getMessage());callback.invoke(data);}}else {Log.i(TAG,"未传回调函数");}}@UniJSMethod(uiThread = false)public void asyncCount(UniJSCallback callback){if(callback != null) {String rfid = "";JSONObject data = new JSONObject();try {if(isCounting) {return;}UHFGUtil until = UHFGUtil.getInstance();until.count(new UHFGUtilListenner() {@Overridepublic void callBackResult(int num, Set<String> list) {Log.i(TAG+"toGetAllDevices",num+""+list.toString());isCounting = false;data.put("code", "200");data.put("msg","获取数据成功");data.put("total",num);data.put("data",list);callback.invoke(data);}},500);}catch (Exception e){data.put("code", "400");data.put("msg","异常"+e.getMessage());callback.invoke(data);}}else {Log.i(TAG,"未传回调函数");}}@UniJSMethod(uiThread = false)public JSONObject getPower(){UHFGUtil until = UHFGUtil.getInstance();String res = until.getPower();JSONObject data = new JSONObject();data.put("code", "200");data.put("data",res);return data;}}

6.打包插件

选择Android studio上的gradle工具,使用assembleRelease 的方式进行编译,构建。 最后会在当前库下生成 build文件夹,在outputs/aar 生成 arr文件。

然后将 arr文件+libs+.os文件重新放在一起,构建成uni-app所需的原生插件。 到此,原生插件开发完成。

目录结构:

7.引入项目

本地引入

在项目下创建目录 nativeplugins 将插件包放在该目录下,插件结构参考前问。

配置完成后,需要打包为自定义基座才能使用。

云端插件

将插件发布到云市场,然后就可以通过使用云端插件的方式使用。同样,测试时候需要打包自定义基座。

8.web端调用代码

 var modal = uni.requireNativePlugin('Taric-UHFG');modal.getSyncRFID(function(res) {                      that.animals = Array.from(new Set(that.animals.concat(res.data)))that.amount = that.animals.length;that.nodocAnimals = that.animals;                     });

其他的坑及参考

  • 1.Android studio gradle 无法用Tasks assembleRelease 打包库

解决方案:blog.csdn.net/shulianghan…

  • 2.出现Duplicate class 的报错

多半是有重复的类,或者说是不同jar包定义了相同的类导致。去掉非必要的jar包。

我出现问题的原因是,在引入第三方包的时候采用了 implementation 的方式,该方式会将第三方包编译到 aar文件当中,而uniapp的插件规范是有 libs库的,所以出现两份,报 Duplicate class 的错误.

编译时的区别

  • 3.[JS Framework] 当前运行的基座不包含原生插件[Taric-UHFG],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座

参考package.json 标准:nativesupport.dcloud.net.cn/NativePlugi…

我出错的问题是 package.json 中 id与plugins里的name不一致的问题

小结

整体上来将,简单的集成第三方库,不太需要过多的了解android原生的知识,但需要对gradle这套有一定的理解。

本任务耗时1.5天;如果要测试就得打包到基座,我把uni-app都打毛了,说次数太多明天再来。

记一次uni-app Android原生插件开发相关推荐

  1. Android原生插件开发-开发篇

    原创文档:Android原生插件开发-开发篇 · 语雀 官方文档:原生开发者支持 创建module 点击File=>New=>New Module 选择Android Library,输入 ...

  2. Uniapp关于 Android原生插件开发案例

    目录 一.准备工作(开发环境) 二.实操 1.使用Android studio开发工具打开UniPlugin-Hello-AS工程请在App离线SDK中查找 ​编辑 2.创建Andorid Libra ...

  3. UNI APP---Android端原生插件开发实战(二)

    1.前言 最近一个项目要求我们的产品必须走网络隧道,并且提供了对应的SDK,很明显只能通过原生开发的方式才能实现这个流程,之前已经写过一篇通过代理的方式进行数据请求,而这次Android端的方式是采用 ...

  4. Android原生插件开发-证书jks篇

    原创地址:Android原生插件开发-证书jks篇 · 语雀 jks生成 下载Android Studio Download Android Studio & App Tools - Andr ...

  5. uniapp集成Android原生sdk

    最近公司有个项目,需要调用客户提供的sdk扫描rfid,项目又是用uni开发的,客户提供的sdk只有Java版本,我发现uni是提供集成原生sdk的,所以研究了一下怎么使用,并记录下来过程. 准备 S ...

  6. uniapp调用手机摄像头_uniapp原生插件开发之调用原生方法(android)

    需要实现的功能: 点击uniapp页面view,传递参数,调用android原生代码,然后原生代码处理数据,返回到uniapp页面 步骤 1.编写uniapp的视图页面 {{title}} 点击调用a ...

  7. Android uni app 列表底部白条解决方案

    uni app中android打开本地vue的列表会发现,底部有条白边. vue通过uni.getSystemInfoSync();方法获取系统信息,首次取值对,再次取值就出错 uni app每次启动 ...

  8. uni原生插件开发--友盟一键登录

    原生插件开发--友盟一键登录(UMVerify) 友盟SDK准备 下载UMVerify SDK 将SDK 导入项目 遇到的问题 代码调用 iOS端代码 iOS 登录成功返回数据 uniapp端代码 本 ...

  9. android没有界面app,Android离线打包 app处于原生界面 切换到桌面再点击app 原生界面被关闭...

    Android离线打包环境, 当app打开原生界面时,点击Home键到桌面,然后点击桌面图标打开app,原生界面被关闭,无论原生界面层级多少,都是返回到io.dcloud.PandoraEntry这个 ...

最新文章

  1. 使用python线性规划学习总结
  2. LINUX下PHP使用PDO访问MYSQL的连接设置注意事项
  3. 轻量化版本优于MobileNet系列 | Tokens-to-Token ViT: Training Vision Transformers from Scratch on ImageNet
  4. 【Elasticsearch】Elasticsearch 的异步搜索原理解析 _async_search
  5. NexentaFusion配置文档
  6. 计算机可爱的企鹅教案,《可爱的企鹅》教学设计
  7. 白帽子也能迎娶白富美:2017八大高薪信息安全认证
  8. his提供哪些服务_品牌战略咨询能为企业提供哪些服务
  9. Python 实现控制一阶惯性系统
  10. 聊聊我在腾讯和字节工作感受
  11. juniper防火墙配置
  12. vue实现搜索框记录搜索历史_Vue 实现输入框新增搜索历史记录功能
  13. 【JZOJ6124】有限空间跳跃理论
  14. 打印100以内的质数
  15. [ Linux ] 可重入函数,volatile 关键字,SIGCHLD信号
  16. 机械臂速成小指南(十):可达工作空间
  17. DSP主机 与 STM32从机 的SPI通信(待续)
  18. openssl C++ DSA对指定文件内容签名和解签
  19. ADM485ANZ ADI
  20. 【Flutter】仿照哔哩哔哩做的APP

热门文章

  1. 投资理财交易系统设计与开发
  2. 大学计算机导学,大学计算机一级——导学.ppt
  3. 如何进行代码重构 ——让代码更加美观易检查
  4. UVA11988 破损的键盘
  5. Dell戴尔外星人笔记本电脑Alienware m15 R3原装出厂Windows10系统恢复原厂OEM系统
  6. tlwr886n发挥最大网速_首搭5G+Wi-Fi6 网速起飞!荣耀平板V6评测:最强网络与旗舰配置双剑合璧...
  7. Android O适配
  8. 搭建第一个自己的微信小程序
  9. ios12电池测试软件,5款旧iPhone升级iOS12.3.1续航测试:真的有提升
  10. html form阴影,HTML CSS边框阴影的实现