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

回到顶部