范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

记一次uniappAndroid原生插件开发

  背景
  项目使用到了RFID射频手持设备(PDA),用于读取羊只耳标功能。 原来有写过一个插件 https://ext.dcloud.net.cn/plugin?id=5246,新的设备与原来的不一样,所以需要重新写一遍。
  之前没有记录,这次重新记录下过程。
  使用的硬件设备Demo 为: uhfg_v2.2.10;资料原生插件开发资料官方:
  https://nativesupport.dcloud.net.cn/NativePlugin/README
  步骤1.下载App离线SDK及demo导入
  https://nativesupport.dcloud.net.cn/AppDocs/download/android
  下载后有对应的工程文件,需要使用Android Studio导入。
  我下载的是 3.5.0,目录结构是:
  我们将UniPlugin-Hello-AS导入到Android Studio 中。
  导入后目录结构是这样的:
  我做的项目是使用原生的扫描耳标的能力,不需要界面,所以插件是 扩展 Module 的形式。2.新建module uhfg模块
  3.导入uhf的库及配置build.gradle
  uhfg模块 的build.gradle plugins {     id "com.android.library" }  android {     signingConfigs {         release {         }     }     compileSdkVersion 30      defaultConfig {         minSdkVersion 21         targetSdkVersion 30         versionCode 1         versionName "1.0"          testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"         consumerProguardFiles "consumer-rules.pro"     }      buildTypes {         release {             minifyEnabled false             proguardFiles 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.javapackage 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;//uhf      public 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 allDevices = new HashSet();         while (times <3){             times +=1;             manager.asyncStartReading();             try {                 int finalTimes = times;                 new Handler().postDelayed(new Runnable() {                     @Override                     public void run() { //                    tagInventoryByTimer                         List 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 "; //                        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 allDevices = new HashSet();         try {             new Handler().postDelayed(new Runnable() {                 @Override                 public void run() { //                    tagInventoryByTimer                     List 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 "; //                        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 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.javapackage com.nmbaiyun.yangrong.uhfg;  import java.util.Set;  public interface UHFGUtilListenner {     public void callBackResult(int num, Set 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() {                     @Override                     public void callBackResult(int num, Set 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 将插件包放在该目录下,插件结构参考前问。
  在manifest 中配置本地插件;
  配置完成后,需要打包为自定义基座才能使用。云端插件
  将插件发布到云市场,然后就可以通过使用云端插件的方式使用。同样,测试时候需要打包自定义基座。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 打包库
  解决方案:https://blog.csdn.net/shulianghan/article/details/1244893982.出现Duplicate class 的报错
  多半是有重复的类,或者说是不同jar包定义了相同的类导致。去掉非必要的jar包。
  我出现问题的原因是,在引入第三方包的时候采用了 implementation 的方式,该方式会将第三方包编译到 aar文件当中,而uniapp的插件规范是有 libs库的,所以出现两份,报 Duplicate class 的错误.
  编译时的区别
  3.[JS Framework] 当前运行的基座不包含原生插件[Taric-UHFG],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座
  参考package.json 标准:https://nativesupport.dcloud.net.cn/NativePlugin/course/package
  我出错的问题是 package.json 中 id与plugins里的name不一致的问题
  小结
  整体上来将,简单的集成第三方库,不太需要过多的了解android原生的知识,但需要对gradle这套有一定的理解。
  本任务耗时1.5天;如果要测试就得打包到基座,我把uni-app都打毛了,说次数太多明天再来。附件
  源码:https://gitee.com/dream-as-horse/uni-app-rfid-plug-in.git

谷爱凌疑恋情曝光!与外国帅哥亲密搂抱坐大腿,高调晒照疑官宣?谷爱凌疑恋情曝光!与外国帅哥亲密搂抱坐大腿,姿势暧昧虽然冬奥会结束后谷爱凌就回到了美国,但是她依然会在社交平台上更新自己的状态,也能让国内粉丝们时时地了解她生活的一举一动。根据她以第二届CCF司南杯量子计算编程挑战赛即将开启报名近日,记者从有关方面获悉,由中国计算机学会(CCF)主办,CCF量子计算专业组和合肥本源量子计算科技有限责任公司(安徽省量子计算工程研究中心)承办的第二届CCF司南杯量子计算编程挑科创板三季报集体业绩说明会拉开序幕沪上芯片圆桌论坛成功举办本报记者吴晓璐见习记者毛艺融11月11日,追中国芯,观上海造科创板2022年三季度业绩说明会集成电路专场暨圆桌论坛在上海顺利召开。4家科创板上市公司安路科技概伦电子格科微聚辰股份就高成长企业丨量产全球首款WiFiHaLow芯片,泰芯半导体想在物联网领域弯道超车作者丨彭敏静编辑丨李振近期,两个融资事件让全球两家有能力生产WiFiHaLow芯片的企业齐齐亮相在聚光灯下。今年9月,澳大利亚摩尔斯微电子完成了1。4亿美元的B轮融资10月,珠海泰开发下一代2nm芯片,丰田索尼等八大日企组建公司据媒体报道,包括丰田汽车和索尼集团在内的八家日本公司合作成立了一家芯片公司,以在日本生产下一代半导体。其他参与合作的成员还包括零部件供应商电装软银日本电报电话公司半导体制造商kioASO优化揭秘苹果商店(AppStore)搜索排名算法(2022年最新版)据苹果官方数据,应用商店搜索推动了应用下载总量的65,所以保持应用在搜索结果中排名靠前对下载量至关重要。那么,如何在苹果应用商店搜索结果中排名靠前呢?一起来看一下吧。您知道大多数人花费32亿元打造!iPhone14卫星求救功能即将上线11月10日消息,据macrumors报道,iPhone14的卫星紧急求援(EmergencySOSwithSatellite)功能将于11月上线,苹果将向Globalstar等公412老D其他模玩其他版本盘点前面已经介绍了圣兽传说的套装,现在进一步就其他版本进行一下盘点,以供大家参考。在介绍之前重点说明下国产圣兽传说很多都带有原版的小熊厂铭文,因此单靠铭文无法判断是否是原版,这点需要玩五行缺水取名女孩名字,五行属水男孩子名字大全起好名字具体做法是什么,下文宝宝适合的起名大全,也来看看吧。温文尔雅的姓名,温文尔雅的性格是属于很招人喜欢的,如果所起姓名也属于温文尔雅的那种,那就更好了。这样可以展现孩子温柔礼貌男篮世预赛中国男篮击溃伊朗,王哲林爆发23分赵睿12分7助攻中国队面对伊朗这支老冤家,整场比赛真的看得让人心惊胆跳,差一点又以为要虎头蛇尾了,在最后的二分钟时候我们只领先2分,还好关键时候稳住了,在别人地盘送别人回家了!让我们能基本锁定好世江诗丹顿TraditionnelleTourbillon中国限量版瑞士高端制造商江诗丹顿(VacheronConstantin)拥有向中国提供特定手表的悠久传统。例如,该品牌每年都会推出专门针对十二生肖的MtiersdArt腕表,例如最近推出的虎
去了乌克兰才知道人民币有多强!乌克兰美女1万元玩到不想走乌克兰美女如云是全世界公认的事情,乌克兰不仅美女众多,并且还是一个典型女多男少的国家,为此也是外来游客的一大福音,如果男游客足够幸运,说不定乌克兰一游,还可以找到一位异国美女伴侣。外交部新晋发言人毛宁,母校引发热议,一经亮相惊艳了众人自从我们的科技越来越发达之后,大家都可以通过互联网了解到非常多国内大事记,甚至和国际接轨。一根小小的网线让国家与国民们瞬间亲近了很多,我们还可以实时了解到许多国家大事,就像我们的外宣化四中知识青年上山下乡的塘子营村李爱萍在头条的朋友中,有一位前辈,她当年是宣化四中的学生,1965年曾到赤城东万口乡塘子营村上山下乡。我写过赤城不少文章,其中就包括塘子营。说起来,老前辈对塘子营村有深深的感情和怀石头上的古镇,数百年历史的军商城堡,被时光遗忘在了赤水河畔赤水河,中国的美酒河,在赤水河两岸,不仅有数不尽的酒厂,也有如遗珠般散落的古镇,这些古镇大多是因水而建,因水而繁荣,位于贵州赤水市中南部的丙安古镇,就是其中的佼佼者。在古代,丙安古孟晚舟回母校演讲读书万卷,咖啡千杯Tech星球9月2日消息,据都匀一中,9月2日,华为副董事长轮值董事长CFO孟晚舟来到贵州都匀市,与母校都匀一中和都匀三小的师生共上开学一堂课,发表了读书万卷,咖啡千杯的主题演讲。粟裕包围蒋介石王牌主力,毛主席却下令火速撤退!事后大赞高明在阅读此文之前,麻烦您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持!解放军中猛将如云,有些是国外留学投身革命,比如邓小平,陈毅,有些是名校黄埔军校毕歼灭一群土匪,俘虏中发现原解放军副营长,贺龙杀,一定得杀在解放战争中,贺龙元帅的出场率其实并不怎么高,因为胡宗南大举进攻延安时,他本人正在晋北指挥作战,所以他的老部队就交给彭德怀统一指挥,后来的西北野战军第一野战军司令员都是彭德怀,贺龙华山论道世上只有想不通的人,没有走不通的路人生的道路,阡陌交错,五味杂陈。生活的滋味,甘苦互依,咸涩共存走过崎岖,才知平坦经历风雨,方见彩虹。只要心里还存着不甘心,那就还不到放弃的时候。没有殷实的家庭,没有显赫的背景,要想诗歌在中国大地上清泉浴鹿作在中国大地上白天鹅点赞绿水跃向蔚蓝的天空梅花鹿畅想远方划过一道美丽的彩虹绿孔雀翩翩起舞展开亮丽的风景藏羚羊低吟浅唱弹拨着悠扬的琴弦在中国大地上姹紫嫣红的花朵弥漫着沁人心脾抄书打卡1day你安好,我无恙,便是世上最好的时光这个世界,我们都只来一次。回忆前几年,我们曾经天涯海角畅游,无拘无束地快乐过,而现在,我们只能静静地等待。我们沉郁过,难过过,便终究你我平安才是最美最好的时光。我不算是个乐观的人,世上本无病,只是脉不通,张仲景经典方,通脉,通血,通全身大家好,我是赵医生,今天给大家介绍一个医圣张仲景的经典方,可以温经散寒,疏通筋脉血管,温散全身之寒,快来看看吧!你是否有这种情况?经常感觉头痛肚子痛,肩背,腰膝关节甚至腿也又冷又痛