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

