【问题标题】:Scanning barcode with AVCaptureMetadataOutput and AVFoundation使用 AVCaptureMetadataOutput 和 AVFoundation 扫描条码
【发布时间】:2013-12-16 11:59:43
【问题描述】:

我正在使用 AVFoundation 和 AVCaptureMetadataOutput 在 iOS7 中扫描 QR 条码,我提供了一个视图控制器,允许用户扫描条码。它工作正常,即。正在扫描条形码,我可以将条形码字符串输出到控制台。

但它会一遍又一遍地扫描,请参阅屏幕截图。我想要它做的是只扫描一次条形码然后dismissViewController。

这是我的委托方法代码:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
CGRect highlightViewRect = CGRectZero;

AVMetadataMachineReadableCodeObject *barCodeObject;
NSString *detectionString = nil;
NSArray *barCodeTypes = @[AVMetadataObjectTypeUPCECode, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode39Mod43Code,
        AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeCode128Code,
        AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeQRCode, AVMetadataObjectTypeAztecCode];

for (AVMetadataObject *metadata in metadataObjects) {
    for (NSString *type in barCodeTypes) {
        if ([metadata.type isEqualToString:type])
        {
            barCodeObject = (AVMetadataMachineReadableCodeObject *)[self.preview transformedMetadataObjectForMetadataObject:(AVMetadataMachineReadableCodeObject *)metadata];
            highlightViewRect = barCodeObject.bounds;
            detectionString = [(AVMetadataMachineReadableCodeObject *)metadata stringValue];
            break;
        }
    }

    if (detectionString != nil)
    {
        NSLog(@"Barcode: %@", detectionString);

        break;
    }
    else
        NSLog(@"None");
}

self.highlightView.frame = highlightViewRect;

}

【问题讨论】:

  • 使用以下答案修复:stackoverflow.com/questions/19525132/…
  • 你是如何解决这个问题的?我有一个类似的问题,按照上面列出的 SO 答案并没有解决我的问题。
  • 我可以看看你正在使用的代码吗?我使用了答案中的代码并配置了它以供我使用

标签: ios iphone ios7 avfoundation barcode


【解决方案1】:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    ....
    self.highlightView.frame = highlightViewRect;
    [_session stopRunning]; //<---I add this and it worked for me.
}

Here is a good link 这可能会有所帮助。

【讨论】:

    【解决方案2】:

    您需要使用以下方法停止 captureSesson: captureSession.stopRunning()扫码一次,否则即使videoPreviewLayer停止扫码也会继续扫码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      相关资源
      最近更新 更多