.NET MAUI应用重启设备后无法读取内置125kHz读卡器数据的问题咨询
问题分析与解决方案
问题关联判断
这部分广播注册逻辑大概率是导致你问题的核心原因。重启设备后,内置的RFID读卡器硬件可能处于未初始化、未激活的休眠状态。预装Java应用启动时,除了注册这些广播接收器监听状态,肯定还执行了读卡器的初始化流程(比如发送指令打开硬件、配置参数);而这些广播是用来监听初始化完成、设备状态变更的回调。
你直接启动MAUI应用时,没有触发读卡器的初始化流程,硬件未激活,自然读不到卡号;先启动Java应用再退出,硬件已经被初始化激活,所以MAUI应用能正常读取。
.NET MAUI中实现对应逻辑的步骤
1. 实现Android平台的广播接收器
由于MAUI的跨平台特性,广播相关逻辑需要在Android项目中编写:
[BroadcastReceiver(Exported = true)] public class RFIDStatusReceiver : BroadcastReceiver { private Action<string> _statusCallback; // 注册状态回调 public void SetStatusCallback(Action<string> callback) { _statusCallback = callback; } public override void OnReceive(Context context, Intent intent) { if (intent == null || string.IsNullOrWhiteSpace(intent.Action)) return; _statusCallback?.Invoke(intent.Action); } }
2. 在页面/服务中注册广播并触发初始化
在MAUI的页面(或专用的RFID服务类)中,针对Android平台实现注册逻辑,并主动触发读卡器初始化:
#if ANDROID private RFIDStatusReceiver _rfidReceiver; private Android.Content.Context _androidContext; #endif protected override void OnAppearing() { base.OnAppearing(); #if ANDROID _androidContext = Android.App.Application.Context; _rfidReceiver = new RFIDStatusReceiver(); _rfidReceiver.SetStatusCallback(HandleRFIDStatusChange); // 创建IntentFilter,监听目标action var intentFilter = new Android.Content.IntentFilter(); intentFilter.AddAction("shmaker.android.intent.action.OPEN_DONE"); intentFilter.AddAction("shmaker.android.intent.action.CLOSE_DONE"); intentFilter.AddAction("shmaker.android.intent.action.STATE_REFRESH"); // 注册广播接收器 _androidContext.RegisterReceiver(_rfidReceiver, intentFilter); // 关键:触发读卡器初始化(需要从Java源码中确认正确的action) // 假设Java应用通过发送这个广播启动读卡器,实际需以源码为准 var initIntent = new Android.Content.Intent("shmaker.android.intent.action.OPEN_READER"); _androidContext.SendBroadcast(initIntent); #endif } protected override void OnDisappearing() { base.OnDisappearing(); #if ANDROID // 注销广播接收器,避免内存泄漏 if (_rfidReceiver != null) { _androidContext.UnregisterReceiver(_rfidReceiver); _rfidReceiver = null; } #endif } private void HandleRFIDStatusChange(string action) { switch (action) { case "shmaker.android.intent.action.OPEN_DONE": // 读卡器初始化完成,开始监听串口/dev/ttyS1 StartSerialPortListening(); break; case "shmaker.android.intent.action.CLOSE_DONE": // 读卡器关闭,停止串口监听 StopSerialPortListening(); break; case "shmaker.android.intent.action.STATE_REFRESH": // 根据需要处理状态刷新逻辑 RefreshRFIDStatus(); break; } } // 你的串口监听逻辑 private void StartSerialPortListening() { // 这里实现System.IO.Ports连接/dev/ttyS1并监听数据的逻辑 } private void StopSerialPortListening() { // 停止串口监听并释放资源 } private void RefreshRFIDStatus() { // 可选:刷新读卡器状态的逻辑 }
3. 关键补充:确认Java应用的初始化指令
一定要仔细查看预装Java应用的源码,找到它启动时初始化读卡器的具体方式:
- 是发送了特定广播?(比如上面假设的
OPEN_READER) - 还是调用了系统服务、JNI本地方法?
只有准确复现这一步初始化操作,才能在重启设备后直接通过MAUI应用激活读卡器。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

