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

记一次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

梦华录全剧最善伪装之人浮出水面,比欧阳旭还会伪装电视剧梦华录中,人物众多,千奇百态。有真君子,伪君子,也有真小人。可谓林子大了,什么鸟都有。真君子好处,真小人易防,最难相处最难防范的恐怕就是伪君子了吧,因为他们伪装得太深,让人防长得显矮的10位男星,明明快1米9的大高个,看起来就是不高每个明星在娱乐圈的发展中,因为工作的特殊性,脸部或多或少都有些微调,脸可以整,身高却是先天就已经决定好的。俗话说人不可貌相。有些男明星早身高方面先天比较优势,但却长了一张让人误以为洋葱保税仓发出的货会有假吗?货之家保税仓入驻申请由于跨境电商作为一个新兴行业,并在2015年突然有了爆发性的增长,但整个行业发展却仍不太成熟和完善,而且受到各国国情不一和海关业务饱和和国内电商活动等不可控性的影响,广大消费者对于从Celsius到三箭加密百亿巨头们的多米诺史诗级流动性的枯竭转自区块律动BlockBeats自今年5月以来,加密市场就再也没有太平过。短短一个月,我们见证了Luna400亿美元金融帝国一夜崩塌ETH2。0全球最大去中心化节点Lido衍生品脱大失所望!苹果M2性能跑分曝光继续挤牙膏,奈何还是没对手6月16日消息,据外媒macrumors报道,苹果M2芯片的跑分数据已出现在Geekbench测试平台上,它搭载于苹果新发布的13英寸MacBookPro上。数据显示,苹果M2在多三星新机渲染图曝光Exynos850芯片加持下巴感人手机中国新闻近日,互联网上放出了一组三星GalaxyA04Core的高清渲染图,该机和GalaxyA03Core并没有太大的区别,配备了前置水滴屏和后置单摄,可能是今年三星最便宜的库克回馈果粉?iPhone13直降1201元,苹果A15128GBIP68防水担任苹果公司CEO长达11年的库克其实已经到了退休的年龄,但是他并未选择退休,有人认为他是因为热爱所以仍然选择继续留任,但就更多人看来,库克选择留任或多或少还是因为钱,普通的薪资对出售78台光刻机,美国却放任不管,外媒ASML立场正在转变光刻机是国产芯片最大的短板,ASML公司是全球光刻机龙头企业,受美国制约的ASML公司近期的种种行为出乎所有人的意料。是ASML公司主动争取的结果,还是美国默许下的别有用心?ASM国产芯片日产10亿颗,再破纪录!东南大学矢志一流,助造中国芯!一张只有指甲盖大小的芯片上,往往集成了几十亿个元件,精度要求达到了头发丝的千分之一甚至万分之一,涉及无数个前沿核心技术,这也是人类精密制造的极限之一。纵观全球先进制造业,任何领域的高质量发展调研行大写的牛!这家万亿市值车企技术鱼池里养着鲸与鲨高质量发展调研行企业综述首家万亿市值中国车企比亚迪技术鱼池里养着鲸与鲨比亚迪展厅巨大的专利墙引人注目,展示了从逾万项自有专利中精选出来的3000多项专利证书。6月10日,随着比亚迪美联储宣布近30年最大力度加息,中国大幅减持美债,日本选择跟进由于美国5月份的CPI指数上涨超过了白宫的预期,同时也给拜登施加了巨大的经济压力,因此在公布了这一指标不久后,美联储就决定再度加码。据环球网6月16号发布的报道,美联储正式宣布启动
600亿元乘用车购置税蛋糕待分多家车企在等细则经观汽车摘要多家机构研报表示,600亿购置税减免力度空前。这份国家送给汽车行业的大蛋糕,将怎么分?记者周菊在汽车行业4月份产销巨幅下挫5月份仍未出现明显拐点的背景下,行业期待政策之手介入的2022年4月拖拉机产量数据出炉,连续两个月下降近日,国家统计局发布2022年4月份规模以上轮式拖拉机生产企业大型中型小型拖拉机产量数据。国家统计局标准大型拖拉机大于100马力中型拖拉机25100马力小型拖拉机小于25马力。一4玩明白了,杜兰特能否带动詹姆斯不重要,商业联盟的根基是知名度篮网今夏全力拿下詹姆斯,夺冠与否已经不再重要,若是想要篮网在纽约这个地接超越尼克斯,那么篮网光凭一两次总冠军是做不到的,关键还是得将自身的知名度打开。想要让篮网的知名度再上一层楼,最佳阵容出炉,东契奇位置引关注,独行侠扳回一城也难让人开心按照现在打完了西部决赛第四场之后的数据,东契奇以场均36。4分10。2个篮板和8。8次助攻,位列所有历史上东西部决赛当中,以13落后的球队里面球员得分榜的第一位。也就是说,东契奇的季后赛苦尽甘来的六大球星,霍福德触底反弹,维金斯兑现天赋宝剑锋从磨砺出,梅花香自苦寒来。这句七言诗同样适用于NBA的舞台。在群星璀璨巨星云集的舞台上,怀才不遇的球星比比皆是,并非每一名球星,都能够兑现天赋,完成蜕变。更多的天才少年终其一2年9710万,湖人计划续约詹姆斯,禅师批珍妮简直失去理智据詹姆斯团队私人爆料,湖人准备和詹姆斯签约2年,薪酬是2年9710万,对于这个薪酬,詹姆斯团队表示非常满意,知道这个消息后,湖人前主教练菲尔杰克逊非常不满,批评湖人老板珍妮巴斯,他赫芮琪珠宝换戴模式赫芮琪品牌成立于2019年,由一群70后和80后创建的自主珠宝品牌,目前经过三年的发展,逐渐崭露头角,成为珠宝中的新贵,一个新锐的珠宝品牌。图片源于网络赫芮琪区别其它国内新潮品牌的冷冻馒头不能吃吗?放冰箱超3天会产生黄曲霉毒素吗?要注意之前在医院上班的时候,我接诊过一个28岁的男性患者,他的主要症状是浑身乏力的非常厉害,而且自己的食欲非常差,身体很消瘦,通过检查报告显示他患上的是原发性肝癌。那么这名患者为什么会得几何E来了最高续航410公里,这车卖多少钱合适?近些年纯电小型SUV市场呈增长态势,比如哪吒V的销量就曾进入过新能源榜前三的位置。近日,吉利旗下几何品牌也带来其全新的小型SUV车型几何E正式亮相。预计正式上市后将与哪吒V形成竞争全新一代性能猛兽iQOONeo6到来,出色配置带来更好游戏体验在如今这个快节奏社会,许多打工人选择节奏快的手游进行日常娱乐。不少游戏厂商也推出高画质大型手游,这对用户的设备有了更高要求。最近iQOO推出全新的iQOONeo6,这款产品在发布后iQOO联合加立小镇APP出新款啦!Neo6配得上游戏性能神机称号?随着游戏手机细分赛道的蓬勃发展,小米黑鲨系列游戏手机,联想拯救者游戏手机,华硕ROG游戏手机以及努比亚红魔等品牌纷纷入局游戏手机赛道,游戏手机概念一时风头无两。最近,游戏手机市场格