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

Xamarin Android绑定库:SCardListReaders返回成功但无读卡器数据

问题分析与解决方案

针对你遇到的Xamarin Android嵌入Jar库后,SCardListReaders返回成功但读卡器列表为空的问题,可从以下几个方向排查:

1. 集合类型兼容性问题

Java与.NET的集合类型存在映射差异,Jar中的SCardListReaders方法可能期望操作Java原生集合而非.NET的System.Collections.IList。你当前传入的List<string>是.NET集合,Java侧可能无法正确向其中写入数据。

修改方案:改用Xamarin提供的Java集合实现类Android.Runtime.JavaList<string>,替换原有的.NET List:

// 替换原集合初始化代码
System.Collections.IList tempReadersList = new Android.Runtime.JavaList<string>();
succes = _SmartCard.SCardListReaders(Application.Context, tempReadersList);
// 将Java集合转换为.NET List
List<string> readersList = tempReadersList.Cast<string>().ToList();

2. 上下文实例选择问题

USBRequestPermission和SCardListReaders可能需要Activity上下文而非Application上下文。Application Context缺少部分与UI、权限回调相关的能力,可能导致权限实际未生效或读卡器枚举失败。

修改方案:传入当前Activity的Context(而非Application.Context),例如在Activity中调用时使用this,或者通过参数传递Activity实例。

3. 初始化步骤的完整性

检查SCardEstablishContext的调用是否符合Jar库要求:部分智能卡库的EstablishContext方法需要指定作用域参数(如用户、系统、会话级别),默认参数可能无法正确枚举读卡器。若Jar库有文档,确认该方法的参数规范;若没有,尝试补充作用域参数(通常为0、1、2这类枚举值)。

4. 补充日志排查

虽然无法调试,但可以通过日志确认集合状态:

// 在调用SCardListReaders后添加日志
Android.Util.Log.Debug("SCardDebug", $"集合类型:{tempReadersList.GetType().FullName}");
Android.Util.Log.Debug("SCardDebug", $"集合元素数量:{tempReadersList.Count}");
foreach (var item in tempReadersList)
{
    Android.Util.Log.Debug("SCardDebug", $"读卡器:{item?.ToString()}");
}

通过日志可以明确是Java侧未填充数据,还是.NET侧转换时丢失了数据。


内容的提问来源于stack exchange,提问作者gureangel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:10:35