移除智能卡终端:SCARD_E_NO_SERVICE CardException
我正在使用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));
}
以上是 移除智能卡终端:SCARD_E_NO_SERVICE CardException 的全部内容, 来源链接: utcz.com/qa/411489.html