当前位置: 首页 > 面试题库 >

移除智能卡终端:SCARD_E_NO_SERVICE CardException

宁卓
2023-03-14
问题内容

我正在使用smartcardio用于智能卡的Java应用程序。必须有可能卸下一个USB读卡器,然后在不重新启动小程序的情况下将其重新插入。

我正在使用terminals()waitForChange()方法来检测终端更改,并且在Linux,MacOS和Win7上运行良好。

但是在Windows 8(仅Windows 8)上,在删除最后一个终端之后,这些方法将抛出SCARD_E_NO_SERVICE
CardException,并且不再检测到更多更改。

我不确定它在说什么“服务”。但是我认为这是在我打电话TerminalFactory.getDefault()TerminalFactory单身人士时在我的线程中启动的。而且我认为这个单例可能有一种方法来管理底层服务,这就是坏处。

是否有人smartcardio在Windows 8 上如何管理终端断开连接?


问题答案:

这篇文章很老,但是对我来说,解决Windows 8上描述的问题对我很有用。

JR Utily的解决方案无法完全发挥作用:如果拔下读取器然后再次插入,则CardTerminal实例上会出现错误。

因此,我添加了一些代码以清除端子列表,如下面的代码所示。

        Class pcscterminal = Class.forName("sun.security.smartcardio.PCSCTerminals");
        Field contextId = pcscterminal.getDeclaredField("contextId");
        contextId.setAccessible(true);

        if(contextId.getLong(pcscterminal) != 0L)
        {
            // First get a new context value
            Class pcsc = Class.forName("sun.security.smartcardio.PCSC");
            Method SCardEstablishContext = pcsc.getDeclaredMethod(
                                               "SCardEstablishContext",
                                               new Class[] {Integer.TYPE }
                                           );
            SCardEstablishContext.setAccessible(true);

            Field SCARD_SCOPE_USER = pcsc.getDeclaredField("SCARD_SCOPE_USER");
            SCARD_SCOPE_USER.setAccessible(true);

            long newId = ((Long)SCardEstablishContext.invoke(pcsc, 
                    new Object[] { SCARD_SCOPE_USER.getInt(pcsc) }
            ));
            contextId.setLong(pcscterminal, newId);


            // Then clear the terminals in cache
            TerminalFactory factory = TerminalFactory.getDefault();
            CardTerminals terminals = factory.terminals();
            Field fieldTerminals = pcscterminal.getDeclaredField("terminals");
            fieldTerminals.setAccessible(true);
            Class classMap = Class.forName("java.util.Map");
            Method clearMap = classMap.getDeclaredMethod("clear");

            clearMap.invoke(fieldTerminals.get(terminals));
        }


 类似资料:
  • 市场上最准确的卡路里计数器基于您的个人数据计算消耗的卡路里数: 体重、身高、年龄、性别 个人最大心率 (HRmax) 您的训练或活动的强度 个人最大摄氧量(VO2max) 卡路里计算基于加速度与心率数据的智能组合。卡路里计算用于准确测量您在训练中消耗的卡路里。 您可以在训练期间查看累计消耗的能量(单位:千卡 (kcal)),也可以在训练后查看消耗的总卡路里数。您还可追踪每日消耗的总卡路里数。

  • 市场上最准确的卡路里计数器基于您的个人数据计算消耗的卡路里数: 体重、身高、年龄、性别 个人最大心率 (HRmax) 您的训练或活动的强度 个人最大摄氧量(VO2max) 卡路里计算基于加速度与心率数据的智能组合。卡路里计算用于准确测量您在训练中消耗的卡路里。 您可以在训练期间查看累计消耗的能量(单位:千卡 (kcal)),也可以在训练后查看消耗的总卡路里数。您还可追踪每日消耗的总卡路里数。

  • 市场上可计算消耗的卡路里数的最准确的卡路里计数器,借助连续心率追踪甚至更为准确。能量消耗计算基于: 体重、身高、年龄、性别 个人最大心率 (HRmax) 训练期间以及连续心率追踪期间的心率 训练之外的活动测量与训练时无心率测试的活动测量 个人最大摄氧量 (VO2max) VO2max说明您的有氧健康情况。通过 Polar 体能测试,您能了解您的预估 VO2max。仅 Polar H7 和 H10

  • 市场上最准确的卡路里计数器基于您的个人数据计算消耗的卡路里数: 体重、身高、年龄、性别 个人最大心率 (HRmax) 您的训练或活动的强度 个人最大摄氧量(VO2max) 卡路里计算基于加速度与心率数据的智能组合。卡路里计算用于准确测量您在训练中消耗的卡路里。 您可以在训练期间查看累计消耗的能量(单位:千卡 (kcal)),也可以在训练后查看消耗的总卡路里数。您还可追踪每日消耗的总卡路里数。

  • 市场上可计算消耗的卡路里数的最准确的卡路里计数器。能量消耗的计算基于: 体重、身高、年龄、性别 个人最大心率 (HRmax) 训练时的心率 训练之外的活动测量与训练时无心率测试的活动测量 个人最大摄氧量 (VO2max) VO2max说明您的有氧健康情况。通过 Polar 有氧健康测试,您能了解您的预估 VO2max。 

  • base杭州,校招投递现场面试, 自我介绍 实习经历 职业规划 对技术支持岗位的理解 可不可以接受出差 酒量如何 沟通能力怎么样 面试不到十分钟,据说面试官是产品老总,第二天hr谈薪资,给的校招白菜价,绩效20%,据说公司福利还可以,不清楚加班情况。