【问题标题】:Call to Reader.Capture() in DigitalPersona U.are.U SDK does not return在 DigitalPersona U.are.U SDK 中调用 Reader.Capture() 不返回
【发布时间】:2021-06-02 15:28:24
【问题描述】:

我正在为 DigitalPersona U.are.U 4500 指纹读取器开发应用程序,并使用 U.are.U 2.2.3 SDK Java API。

SDK 附带的示例 Java 应用程序可以完美运行。

但是,当我尝试在自己的示例应用程序中做同样的事情时,对 Reader.Capture() 方法的调用永远不会返回,即使在记录我的指纹时我可以看到读取器在闪烁。​​

以下是我尝试过的示例代码的变体。

我尝试过的其他事情:

  • 在类的实例中运行捕获代码(即不在静态上下文中)
  • 也在自己的线程中运行捕获操作,但结果相同。
  • 使用演示应用程序中的 CaptureThread 类

我可以看到我的示例和 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。这也取自示例应用程序。

【问题讨论】:

  • 嗯...如果-1 意味着永远等待,那么设置一些超时时间并查看是否返回异常或任何其他可以提供更多提示的错误? (只是一个有根据的猜测......)
  • 我想我可以尝试一下,但就像我说的那样,相同的设置在示例应用程序中可以完美运行。当我在 SDK 示例应用程序中用手指触摸阅读器时,该方法直接返回。我会尝试并让您知道它是否返回任何有意义的结果。
  • 好的,所以给它一个超时只会返回一个带有标志的结果,表明它已经超时,没有别的。

标签: java digital-persona-sdk


【解决方案1】:

我终于设法让一个示例正常工作。

看起来很奇怪,它只能在 Java GUI 应用程序的上下文中工作。

因此,简单地扩展一个 JFrame 并在单独的线程上启动读取器捕获似乎就足够了。

我可以看到的 SDK 文档中的任何地方都没有指定此要求。

更新

问题似乎比我最初想象的要严重。不仅必须在 Java GUI 应用程序的上下文中调用 API,而且GUI 也必须处于焦点位置,否则捕获调用根本不会返回。

我已通过示例 SDK 应用程序验证了这一点。如果应用程序不在焦点上,则 Capture() 方法不会返回。这也适用于 C# 示例,其中窗口必须处于焦点位置,这表明这是内置于解决方案附带的 DLL 中的。

这对于我们的场景来说太糟糕了,我们想要开发一个浏览器可以与之通信的本地服务,因为当浏览器处于焦点时,Java 应用程序显然不是。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,可以通过以下独占模式打开阅读器来解决,

        m_reader.Open(Reader.Priority.EXCLUSIVE);
    

    请参阅文档中的以下几行,

    public static final Reader.Priority COOPERATIVE

    客户端使用此优先级以合作模式打开阅读器。允许具有此优先级的多个客户端。如果客户端具有焦点窗口,则客户端会接收捕获的图像。

    public static final Reader.Priority EXCLUSIVE

    客户端使用此优先级以独占方式打开阅读器。只允许一个具有此优先级的客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多