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

移除智能卡终端: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。 

  • 我已经实现了一个Andoid应用程序-服务器端应用程序。服务器与智能卡读卡器通信。当用户在Android应用程序中触摸按钮时,将构建一个连接到服务器以验证用户。应用和服务器之间交换的消息具有以下格式: 如果消息的类型值,则表明智能卡读卡器中存在错误 如果消息的类型值,则表明智能卡中存在错误 我使用如下代码与智能卡读卡器进行通信: 智能卡IO API具有异常的类。我的问题是,我不知道何时发送类型为或