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

news/2024/12/25 22:07:13 标签: uni-app, javascript, android

前言

最近搞了个设备,需求是读取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.nfclibdemo

import 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.EventBus

class 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返回的值了


http://www.niftyadmin.cn/n/5799502.html

相关文章

RK3576 Android14编译OTA包提示java.lang.UnsupportedClassVersionError问题

最近遇到RK3576 Android14编译OTA包时,出现如下报错log: Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/signapk/SignApk has been…

如何获取 ABAP 内表中的重复项

要识别 ABAP 内表中的重复项,可以结合使用排序和循环。下面的示例展示了如何查找内部表中的重复条目: DATA: BEGIN OF itab OCCURS 0,field1 TYPE i,field2 TYPE c LENGTH 10,END OF itab,wa LIKE LINE OF itab.* Add sample data to internal table it…

sass的用法

一、内置函数变亮和变暗颜色 内置函数:可以自动变化颜色 lighten 和 darken 函数都是通过增加或者减小 HSL 中颜色的亮度来实现调节的。 $amount: 50%;h1 {$color1: #000000;color: lighten($color1, $amount); }h2 {$color2: #ffffff;color: darken($color2, $a…

华为云计算HCIE笔记05

第七章:其它模式 灾备组网 高可用性组网,单核心场景下,直接在两个站点中设置一个第三方仲裁站点,两个站点同时连接到仲裁,并且连接到对方。一旦出现问题,则由仲裁站点进行判断,进行业务切换 双核…

openEuler安装指北

今天不刷题了,今天来弄一下openEuler 原本这是博主的一个实验作业,老师给了代金卷去学习kunpeng上面的课程,但是看了几个视频下来都不是很清楚 但是要知道,一项真的有前景的技术,如果像高中课程那样一点一点嚼碎了喂你…

我用火语言RPA写了个多流程UI界面客户端程序

我用RPA写了个多流程UI界面客户端程序 感谢热心用户分享:使用火语言RPA写了个多流程UI界面客户端程序,视频中应用的分享链接在这里哦,分享: 我用火语言RPA写了个多流程UI界面客户端程序 提取码: MWrG

聊一聊敏捷测试

目录 一、测试是一个活动胜于测试是一个阶段 二、预防缺陷胜于发现缺陷 三、做测试者胜于做检查者 四、帮助构建最好的系统胜于破坏系统 五、团队为质量负责胜于测试者为质量负责 一、测试是一个活动胜于测试是一个阶段 在传统的瀑布模型中,测试作为单独的一个…

flutter教程01 flutter项目的目录结构

Flutter开发基础 Dart语言: Flutter使用Dart语言进行开发。你需要熟悉Dart的基本语法和特性,如变量、数据类型、函数、类、继承、接口等。 Flutter组件: Flutter提供了丰富的UI组件库,你可以使用这些组件来构建你的用户界面。了…