You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:43:20