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

uniapp Native.js原生arr插件服务发送广播到uniapp页面中

前言

最近搞了个设备,需求是读取m1卡,厂家给了个安卓原生demo,接入arr插件如下,接入后发现还是少了一部分代码,设备服务调起后触发刷卡无法发送到uniapp里。
中间是一些踩坑记录,最后面是解决办法,赶时间直接拉到最后

安卓原生广播

demo中的NfcService其中有一个onDataReceived方法,最终调用了LocalBroadcastManager 发送广播

protected void onDataReceived(final ComBean ComRecData) {Log.d(TAG, "发送消息!");LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(getApplicationContext());Intent intent = new Intent(NfcAction.ACTION_NOTIFY_CARD_NUMBER);intent.putExtra(NfcAction.KEY_NOTIFY_DECIMAL_CARD_NUMBER, decimal);intent.putExtra(NfcAction.KEY_NOTIFY_DECIMAL_REVERSE_CARD_NUMBER, decimalReverse);intent.putExtra(NfcAction.KEY_NOTIFY_ORIGINAL_CARD_NUMBER, originHex);intent.putExtra(NfcAction.KEY_NOTIFY_EIGHT_HEX_CARD_NUMBER, eightHex);intent.putExtra(NfcAction.KEY_NOTIFY_EIGHT_HEX_REVERSE_CARD_NUMBER, eightHexReverse);intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);localBroadcastManager.sendBroadcast(intent);Log.d(TAG, "发送消息成功!");
}

MainActivityonCreate里有接收广播

val nfcCardReceiver = NfcCardReceiver()
val intentFilter = IntentFilter()
intentFilter.addAction(NfcAction.ACTION_NOTIFY_CARD_NUMBER)
LocalBroadcastManager.getInstance(this).registerReceiver(nfcCardReceiver, intentFilter)

NfcCardReceiver

package com.rt.nfclibdemoimport android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
import com.rt.lib_nfc.NfcAction
import org.greenrobot.eventbus.EventBusclass NfcCardReceiver: BroadcastReceiver() {override fun onReceive(p0: Context?, p1: Intent?) {if (p1 != null) {val card = p1.getStringExtra(NfcAction.KEY_NOTIFY_ORIGINAL_CARD_NUMBER)val card2 = p1.getStringExtra(NfcAction.KEY_NOTIFY_DECIMAL_CARD_NUMBER)val card3 = p1.getStringExtra(NfcAction.KEY_NOTIFY_DECIMAL_REVERSE_CARD_NUMBER)val card4 = p1.getStringExtra(NfcAction.KEY_NOTIFY_EIGHT_HEX_CARD_NUMBER)val card5 = p1.getStringExtra(NfcAction.KEY_NOTIFY_EIGHT_HEX_REVERSE_CARD_NUMBER)//跟ui绑定的东西,忽略掉EventBus.getDefault().post(CardBean(card!!, card2!!, card3!!, card4!!, card5!!))Log.e("TAG", "onReceive: " + card + "---" + card2 + "---" + card3 + "---" + card4 + "---" + card5)}}
}

根据以往的经验写出如下代码,结果是失败的

const mainActivity = plus.android.runtimeMainActivity();
const NfcAction = plus.android.importClass('com.rt.lib_nfc.NfcAction');
var nfcCardReceiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {onReceive: function(context, intent) { //实现onReceiver回调函数plus.android.importClass(intent);console.log('context, intent ->', context, intent);console.log('intent.getAction() ->', intent.getAction());}
const IntentFilter = plus.android.importClass('android.content.IntentFilter');
const filter = new IntentFilter();
filter.addAction(NfcAction.ACTION_NOTIFY_CARD_NUMBER); //监听
let LocalBroadcastManager = plus.android.importClass('androidx.localbroadcastmanager.content.LocalBroadcastManager');
let localBroadcastManager = LocalBroadcastManager.getInstance(mainActivity);
localBroadcastManager.registerReceiver(nfcCardReceiver, filter);

最终结果是控制台无输出,
adb shell catlog抓到的日志是个null
在这里插入图片描述找了很久很久后,找到了个栗子,据说绑定不成功的原因是io.dcloud.android.content.BroadcastReceiver这个东西是抽象类,无法实现,只能用io.dcloud.feature.internal.reflect.BroadcastReceiver然而替换后还是不行,就是无法监听LocalBroadcastManager,又找了很久资料,找了无数篇垃圾文章后,找了原生安卓的很多文章后,终于找到了个办法,不用LocalBroadcastManager使用另一种方法发送,接收广播

最终方案

不使用LocalBroadcastManager发生监听广播
使用getApplicationContext().sendBroadcast(intent);发送广播
使用mainActivity.registerReceiver(nfcCardReceiver, filter);监听广播
首先将NfcService->onDataReceived改造,在原有基础上增加,更改后记得重新打成arr,然后重打自定义基座才能生效

protected void onDataReceived(final ComBean ComRecData) {Log.d(TAG, "发送消息!");LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(getApplicationContext());Intent intent = new Intent(NfcAction.ACTION_NOTIFY_CARD_NUMBER);intent.putExtra(NfcAction.KEY_NOTIFY_DECIMAL_CARD_NUMBER, decimal);intent.putExtra(NfcAction.KEY_NOTIFY_DECIMAL_REVERSE_CARD_NUMBER, decimalReverse);intent.putExtra(NfcAction.KEY_NOTIFY_ORIGINAL_CARD_NUMBER, originHex);intent.putExtra(NfcAction.KEY_NOTIFY_EIGHT_HEX_CARD_NUMBER, eightHex);intent.putExtra(NfcAction.KEY_NOTIFY_EIGHT_HEX_REVERSE_CARD_NUMBER, eightHexReverse);intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);Log.d(TAG, "发送localBroadcastManager消息");//原来的发送广播语句//localBroadcastManager.sendBroadcast(intent);Log.d(TAG, "发送getApplicationContext消息");//新增的关键语句getApplicationContext().sendBroadcast(intent);Log.d(TAG, "发送消息成功!");
}

uniapp部分

registerReceiver(){const that = this;const Log = plus.android.importClass('android.util.Log');Log.d('NfcApp', '1');const mainActivity = plus.android.runtimeMainActivity();const NfcAction = plus.android.importClass('com.rt.lib_nfc.NfcAction');const nfcCardReceiverFunc = {  onReceive: function(context, intent) { //实现onReceiver回调函数  plus.android.importClass(intent);console.log('context, intent ->', context, intent);console.log('intent.getAction() ->', intent.getAction());console.log('回调成功!');that.cardData = {};let card1 = intent.getStringExtra(NfcAction.KEY_NOTIFY_ORIGINAL_CARD_NUMBER);let card2 = intent.getStringExtra(NfcAction.KEY_NOTIFY_DECIMAL_CARD_NUMBER);let card3 = intent.getStringExtra(NfcAction.KEY_NOTIFY_DECIMAL_REVERSE_CARD_NUMBER);let card4 = intent.getStringExtra(NfcAction.KEY_NOTIFY_EIGHT_HEX_CARD_NUMBER);let card5 = intent.getStringExtra(NfcAction.KEY_NOTIFY_EIGHT_HEX_REVERSE_CARD_NUMBER);console.log('返回数据->',card1, card2, card3, card4, card5);if(card1 == 'AABB0600000001060007'){return;}//最终返回的数据that.cardData = { card1, card2, card3, card4, card5 };}};const nfcCardReceiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', nfcCardReceiverFunc);const IntentFilter = plus.android.importClass('android.content.IntentFilter');const filter = new IntentFilter();Log.d('NfcApp', '2');filter.addAction(NfcAction.ACTION_NOTIFY_CARD_NUMBER); //监听Log.d('NfcApp', '3');let res = mainActivity.registerReceiver(nfcCardReceiver, filter);Log.d('NfcApp', '4');Log.d('NfcApp', '绑定成功???')//解除绑定,暂未实现//unregisterReceiver
},

重新打包,重新运行后即可接到this.cardData返回的值了

相关文章:

uniapp Native.js原生arr插件服务发送广播到uniapp页面中

前言 最近搞了个设备,需求是读取m1卡,厂家给了个安卓原生demo,接入arr插件如下,接入后发现还是少了一部分代码,设备服务调起后触发刷卡无法发送到uniapp里。 中间是一些踩坑记录,最后面是解决办法&#xf…...

如何在 Ubuntu 22.04 上安装 Elasticsearch

简介 在本教程中,你将学习如何在 Ubuntu 22.04 服务器上安装 Elasticsearch。此外,你还将学习如何使用 Elasticsearch REST API 索引和操作数据。 Elasticsearch 是一个基于 Apache Lucene Library 的免费分布式搜索和分析引擎。它是一个快速且可扩展的…...

单片机长耗时前后台任务优化

代码: void Task_10ms(void) {... }//改 void Task_2ms(void) {static uint8_t s_state 0switch(s_state){case 0:....s_state 1;break;case 1:....s_state 2;break;case 3:....s_state 1;break;default: //此段可以去除s_state 0;break; } } 参考链接 MCU长…...

Linux大数据方向shell

一、概述 shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核,还是一个功能相当强大的编程语言,易编写,易调试,灵活性强。 二、shell入门 1.输出hello world touch helloworld.sh&…...

爬虫 APP 逆向 ---> shopee(虾皮) 电商

shopee 泰国站点:https://shopee.co.th/ shopee 网页访问时,直接弹出使用 app 登录查看,那就登录 shopee 泰国站点 app。 手机抓包:分类接口 接口:https://mall.shopee.co.th/api/v4/pages/get_category_tree 请求参…...

axios 常见的content-type、responseType有哪些?

一、Content Type Content Type ,也被称为MIME类型(Multipurpose Internet Mail Extensions),是一种用于标识数据格式的机制。在HTTP协议中,Content Type’通常通过请求或响应头部的’Content-Type’字段来指定。这个…...

从零开始C++游戏开发之第七篇:游戏状态机与回合管理

在游戏开发的道路上,状态管理是一个无法绕开的重要课题。尤其是在棋牌类游戏中,游戏的进行需要有条不紊地按照回合推进,同时管理多个游戏状态,如“等待玩家加入”、“游戏进行中”、“结算阶段”等。如何优雅且高效地实现这些逻辑…...

【全开源】Java多语言tiktok跨境商城TikTok内嵌商城送搭建教程

开发工具:IntelliJ IDEA 部署环境: Tomcat8.x Mysql5.6 JDK1.8 Maven3.x Redis ZooKeeper3.4。 本系统开发使用JAVA技术栈开发 使用uniapp技术栈 支持多端 H5AndroidIOS PC端使用:vueelementui 用户端使用:uniapp 管理端使用&#xff1a…...

mac启ssh服务用于快速文件传输

x.1 在mac上启SSH服务 方法一:图形交互界面启ssh(推荐) 通过sharing - advanced - remote login来启动ssh;(中文版mac应该是 “系统设置 → 通用 → 共享”里打开“远程登录”来启动) 查看自己的用户名和…...

《探索 Apache Spark MLlib 与 Java 结合的卓越之道》

在当今大数据与人工智能蓬勃发展的时代,Apache Spark MLlib 作为强大的机器学习库,与广泛应用的 Java 语言相结合,为数据科学家和开发者们提供了丰富的可能性。那么,Apache Spark MLlib 与 Java 结合的最佳实践究竟是什么呢&#…...

使用 Python 创建多栏 Word 文档 – 详解

目录 引言 一、工具与安装 二、Python 在 Word 中创建简单的多栏布局 三、Python 在 Word 文档的栏间添加分隔线 四、Python 从Word文档的指定位置开启多栏设置 五、Python 为多栏 Word 文档的各栏添加页码 引言 在文档设计中,排版不仅决定了内容的呈现方式&…...

WebPack3项目升级webpack5的配置调试记录

文章目录 前言一、webpack3环境1.1、知识点记录1.1.1、配置解释1.1.2、webpack与sass版本对应关系1.1.3、CommonJS与ESModule1.1.4、node版本管理nvm1.1.5、sass-loader、sass与node-sass 1.2、其他1.2.1、.d.ts是什么文件1.2.2、react与types/react版本对应关系1.2.3、webpack…...

Mysql的MHA高可用及故障切换

Mysql的MHA高可用及故障切换 MHA主从复制的单点问题配置1. 主从复制2. MHA高可用安装MHA的组件配置无密码认证manager节点配置manager节点上测试启动连接 故障切换模拟恢复 MHA master high availability 建立在主从复制基础之上的故障切换的软件系统。 主从复制的单点问题 …...

【ES6复习笔记】箭头函数(5)

简介 本教程将介绍如何在 JavaScript 中使用箭头函数,包括箭头函数的基本语法、特点以及在实际开发中的应用。通过本教程,你将学会如何使用箭头函数来简化代码,提高代码的可读性和简洁性。 箭头函数的基本语法 箭头函数是 ES6 引入的一种新…...

单片机学习笔记——入门51单片机

一、单片机基础介绍 1.何为单片机 单片机,英文Micro Controller Unit,简称MCU 。内部集成了中央处理器CPU、随机存储器ROM、只读存储器RAM、定时器/计算器、中断系统和IO口等一系列电脑的常用硬件功能 单片机的任务是信息采集(依靠传感器&a…...

Docker Run使用方法及参数详细说明

Docker Run使用方法及参数详细说明 基本语法常用参数使用示例总结Docker Run是Docker中最基本的命令之一,用于创建并启动一个新的容器。通过Docker Run,用户可以基于指定的镜像创建一个容器实例,并且可以配置容器的各种参数,如网络设置、存储选项等。下面将详细介绍Docker …...

面试场景题系列:设计限流器

首先看看使用API限流器的好处。 •预防由拒绝服务攻击(Denial of Service,DoS)引起的资源耗尽问题。大型科技公司发布的所有API几乎都强制执行某种形式的限流操作。例如,推特限制每个用户每3小时最多发300条推文。谷歌文档API的默认限制是每个用户每60秒…...

【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块

目录 一、温度传感器模块 (1)资源介绍 🔅原理图 🔅STS30-DIS-B 🌙引脚分配 🌙通信 🌙时钟拉伸(Clock Stretching) 🌙单次触发模式 🌙温度数据转…...

网狐旗舰版源码搭建概览

简单的列一下: 服务端源码内核源码移动端源码核心移动端源码AI控制工具源码多款子游戏源码前端、管理后台、代理网站源码数据库自建脚本UI工程源码配置工具及二次开发帮助文档 编译环境要求 VS2015 和 Cocos3.10 环境,支持移动端 Android 一键编译&am…...

vue3中使用vuedraggable实现拖拽

包安装方式 yarn add vuedraggablenext npm i -S vuedraggablenext属性说明 如果下面的属性说明未能完全看明&#xff0c;可以看左边的对应的菜单查看详细说明和例子。 完整例子 <template><div class"itxst"><div><draggable:list"s…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...