我正在为 DigitalPersona U.are.U 4500 指纹读取器开发应用程序并使用 U.are.U 2.2.3 SDK Java API。
SDK 附带的示例 Java 应用程序可以完美运行。
但是,当我尝试在自己的示例应用程序中执行相同的操作时,对 Reader.Capture() 方法的调用永远不会返回,即使我在记录指纹时可以看到读取器闪烁。
下面是我尝试过的示例代码的变体。
我尝试过的其他事情:
我可以看到我的示例和 SDK 示例应用程序之间的唯一区别是后者是图形应用程序。但为什么这会有所不同呢?
拔掉设备会导致调用失败并出现异常。这是我让它返回的唯一方法。
import com.digitalpersona.uareu.*;
public class Main{
static Reader r;
public static void main(String[] args) {
try {
// Pick first available reader
ReaderCollection rc = UareUGlobal.GetReaderCollection();
rc.GetReaders();
r = rc.get(0);
if (r==null)
return;
// Open Reader
r.Open(Reader.Priority.COOPERATIVE);
System.out.println(r.GetStatus().status); // Outputs READY
// The following call just hangs and never returns...
Reader.CaptureResult
cr = r.Capture(Fid.Format.ISO_19794_4_2005, Reader.ImageProcessing.IMG_PROC_DEFAULT, 500, -1);
System.out.println(cr.quality.name()); // Just to test
} catch (UareUException e) {
e.printStackTrace();
}
}
}
传递给Capture方法的最后两个参数,两个int,分别是分辨率和超时;为无限期超时块传递 -1。这也取自示例应用程序。
我终于成功地让一个例子工作了。
虽然看起来很奇怪,但它只能在 Java GUI 应用程序的上下文中工作。
因此,简单地扩展 JFrame 并在单独的线程上启动读取器捕获似乎就足够了。
我所看到的 SDK 文档中没有任何地方指定此要求。
更新
看来问题比我最初想象的还要严重。不仅必须在 Java GUI 应用程序的上下文中调用 API,而且GUI 也必须处于焦点,否则捕获调用根本不会返回。
我已经使用示例 SDK 应用程序验证了这一点。如果应用程序未处于焦点状态,则 Capture() 方法不会返回。这也适用于 C# 示例,其中窗口必须处于焦点位置,这表明它已内置到解决方案附带的 DLL 中。
这对于我们的场景来说很糟糕,我们想要开发一个浏览器可以与之通信的本地服务,因为虽然浏览器处于焦点,但显然 Java 应用程序不是。
我遇到了类似的问题,可以通过以独占模式打开阅读器来解决,如下所示,
m_reader.Open(Reader.Priority.EXCLUSIVE);
请参阅文档中的以下行,
公共静态最终读者。优先合作
客户端使用此优先级以合作模式打开阅读器。允许多个具有此优先级的客户端。如果客户端有焦点窗口,则会收到捕获的图像。
公共静态最终读者。优先级排他
客户端使用此优先级来独占打开阅读器。只允许一个具有此优先级的客户端。
我在连接设备时遇到以下错误。
java.lang.UnsatisfiedLinkError: no otmcjni in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at com.digitalpersona.onetouch.jni.MatchingLibrary.<clinit>(MatchingLibrary.java:16)
at com.digitalpersona.onetouch.jni.Matcher.<clinit>(Matcher.java:8)
at com.digitalpersona.onetouch.processing._impl.DPFPEnrollmentFactoryImpl$EnrollmentImpl.<init>(DPFPEnrollmentFactoryImpl.java:40)
at com.digitalpersona.onetouch.processing._impl.DPFPEnrollmentFactoryImpl.createEnrollment(DPFPEnrollmentFactoryImpl.java:20)
at com.digitalpersona.onetouch.ui.swing.CapturePanel.<init>(CapturePanel.java:42)
at com.digitalpersona.onetouch.ui.swing.DPFPEnrollmentControl.<init>(DPFPEnrollmentControl.java:32)
哪里可以下载 otmcjni ?请推荐一下?