2013-04-23 90 views
23

我需要将QR代码阅读器集成到应用程序中,并找到tutorialQR代码在iOS应用程序中扫描

我从此link下载了Z-bar sdk。

这是我所做的。

在QRscannerViewController.m

-(IBAction)StartScan:(id) sender 
{ 
    ZBarReaderViewController *reader = [ZBarReaderViewController new]; 
    reader.readerDelegate = self; 

    reader.readerView.torchMode = 0; 

    ZBarImageScanner *scanner = reader.scanner; 
    // TODO: (optional) additional reader configuration here 

    // EXAMPLE: disable rarely used I2/5 to improve performance 
    [scanner setSymbology: ZBAR_I25 
    config: ZBAR_CFG_ENABLE 
     to: 0]; 

    // present and release the controller 
    [self presentModalViewController: reader 
     animated: YES]; 
    [reader release]; 

    resultTextView.hidden=NO; 
} 

- (void) readerControllerDidFailToRead: (ZBarReaderController*) reader 
         withRetry: (BOOL) retry{ 
    NSLog(@"the image picker failing to read"); 

} 

- (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info 
{ 


    NSLog(@"the image picker is calling successfully %@",info); 
     // ADD: get the decode results 
    id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; 
    ZBarSymbol *symbol = nil; 
    NSString *hiddenData; 
     for(symbol in results) 
     hiddenData=[NSString stringWithString:symbol.data]; 
     NSLog(@"the symbols is the following %@",symbol.data); 
     // EXAMPLE: just grab the first barcode 
    // break; 

     // EXAMPLE: do something useful with the barcode data 
     //resultText.text = symbol.data; 
     resultTextView.text=symbol.data; 


     NSLog(@"BARCODE= %@",symbol.data); 

     NSUserDefaults *storeData=[NSUserDefaults standardUserDefaults]; 
     [storeData setObject:hiddenData forKey:@"CONSUMERID"]; 
     NSLog(@"SYMBOL : %@",hiddenData); 
     resultTextView.text=hiddenData; 
    [reader dismissModalViewControllerAnimated: NO]; 

} 

加入所有需要的框架,所以没有referenced from错误。

当我点击扫描按钮时,ZBarReaderViewController显示效果不错,我按住Alt键并左键单击鼠标打开模拟器的照片库并且一切正常。

的问题是什么,

  1. 的QR图像没有得到扫描,即imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo 功能不会被调用。
  2. QR图像显示大于其原始大小。

enter image description here

如何解决这个问题?

为什么图像没有被扫描?

+1

qr应完全可见以供阅读。由于二维码的图像较大,图书馆无法扫描,所有四个角落都应该在图像中。 – 2013-04-23 10:17:34

+0

@SharonNathaniel,如何缩小这个尺寸? – NAZIK 2013-04-23 10:21:22

+1

我建议在设备上将它指向纸张或屏幕上的qr代码。由于您从模拟器中的照片库中提取图像,因此我不确定您可以在将其提供给读取器之前对其进行处理。我建议在设备上试用它。 – 2013-04-23 10:23:50

回答

27

使用zbar和SDK在我们的iPhone应用程序BR和QR码扫描。

你可以找到步步为这一步的文章,怎么做示例代码以及

How to use Barcode Scanner (BR and QR) in iPhone Tutorial (using ZBar)

看看它是如何工作

  1. 下载zbar和SDK从here

  2. 在您的项目中添加下面的框架

    • AVFoundation.framework
    • CoreGraphics.framework
    • CoreMedia.framework
    • CoreAudio.framework
    • CoreVideo.framework
    • QuartzCore。框架
    • libiconv.dylib
  3. 添加库的框架,在您的类下载libzbar.a拉链的

  4. 进口头和确认的委托

    #进口“ ZBarSDK.h“

@interface ViewController : UIViewController <ZBarReaderDelegate> 

5.scan图像

- (IBAction)startScanning:(id)sender { 

    NSLog(@"Scanning..");  
    resultTextView.text = @"Scanning.."; 

    ZBarReaderViewController *codeReader = [ZBarReaderViewController new]; 
    codeReader.readerDelegate=self; 
    codeReader.supportedOrientationsMask = ZBarOrientationMaskAll; 

    ZBarImageScanner *scanner = codeReader.scanner; 
    [scanner setSymbology: ZBAR_I25 config: ZBAR_CFG_ENABLE to: 0]; 

    [self presentViewController:codeReader animated:YES completion:nil];  

} 

6.get结果在

- (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info 
{ 
    // get the decode results 
    id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; 

    ZBarSymbol *symbol = nil; 
    for(symbol in results) 
     // just grab the first barcode 
     break; 

    // showing the result on textview 
    resultTextView.text = symbol.data;  

    resultImageView.image = [info objectForKey: UIImagePickerControllerOriginalImage]; 

    // dismiss the controller 
    [reader dismissViewControllerAnimated:YES completion:nil]; 
} 

希望这会帮助你,也让你在找什么麻烦我知道这个例子,乐意帮忙

Official Docs

+1

+1,伟大的教程,它将在模拟器上工作,或者我必须在设备上测试它 – NAZIK 2013-04-23 13:48:40

+0

@NAZIK我很高兴亲爱的,顺便说一句,我已经测试过它只在苹果设备和它的工作正常,但不知道有关模拟器,你可以给我评论,如果你有任何麻烦,我可以解释任何我知道的。 – swiftBoy 2013-04-24 04:02:07

+2

它完美的设备,保持伟大的工作frnd – NAZIK 2013-05-02 05:54:48

4

FIrst import ZXingWidget library from here

试试这个,

- (IBAction)btnScanClicked:(id)sender { 

    ZXingWidgetController *widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO]; 
    QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init]; 
    NSSet *readers = [[NSSet alloc ] initWithObjects:qrcodeReader,nil]; 
    [qrcodeReader release]; 
    widController.readers = readers; 
    [readers release]; 
    NSBundle *mainBundle = [NSBundle mainBundle]; 
    widController.soundToPlay = 
    [NSURL fileURLWithPath:[mainBundle pathForResource:@"beep-beep" ofType:@"aiff"] isDirectory:NO]; 
    [self presentModalViewController:widController animated:YES]; 
    [widController release]; 


} 

和代表

- (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result { 

} 
+0

哪个sdk必须使用zxing?在哪里下载? – NAZIK 2013-04-23 10:18:37

+0

https://github.com/zxing/zxing/tree/master/iphone – 2013-04-23 10:19:10

77

与发布iOS7一样,您不再需要使用外部框架或库。 带AVFoundation的iOS生态系统现在完全支持扫描从EAN到UPC的QR几乎所有代码。

只需看看Tech NoteAVFoundation programming guideAVMetadataObjectTypeQRCode是你的朋友。

这里是一个很好的教程这说明它一步一步: iPhone QR code scan library iOS7

刚上如何设置了一个小例子:

#pragma mark - 
#pragma mark AVFoundationScanSetup 

- (void) setupScanner 
{ 
    self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

    self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil]; 

    self.session = [[AVCaptureSession alloc] init]; 

    self.output = [[AVCaptureMetadataOutput alloc] init]; 
    [self.session addOutput:self.output]; 
    [self.session addInput:self.input]; 

    [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 
    self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode]; 

    self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session]; 
    self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    self.preview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 

    AVCaptureConnection *con = self.preview.connection; 

    con.videoOrientation = AVCaptureVideoOrientationLandscapeLeft; 

    [self.view.layer insertSublayer:self.preview atIndex:0]; 
} 
+4

这需要成为新的答案! SO的答案可以改变吗? – tambykojak 2014-07-02 13:07:29

+2

不要忘记在'AVCaptureSession'上调用'-startRunning'。请参阅[文档](https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureSession_Class/index.html)。 – Pang 2015-05-10 10:58:04

+0

链接到域名www.ama-dev.com在答案是死的。 – Pang 2017-09-19 09:12:51

6

试试这个在iOS 7及更高版本。

要拍摄QR码:

- (IBAction)Capture:(id)sender { 

    isFirst=true; 
    _session = [[AVCaptureSession alloc] init]; 
    _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    NSError *error = nil; 

    _input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:&error]; 
    if (_input) { 
     [_session addInput:_input]; 
    } else { 
     NSLog(@"Error: %@", error); 
    } 

    _output = [[AVCaptureMetadataOutput alloc] init]; 
    [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 
    [_session addOutput:_output]; 

    _output.metadataObjectTypes = [_output availableMetadataObjectTypes]; 

    _prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session]; 
    _prevLayer.frame = self.view.bounds; 
    _prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    [self.view.layer addSublayer:_prevLayer]; 

    [_session startRunning]; 
} 

阅读,使用它的委托方法:

- (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 *)[_prevLayer transformedMetadataObjectForMetadataObject:(AVMetadataMachineReadableCodeObject *)metadata]; 
       highlightViewRect = barCodeObject.bounds; 
       detectionString = [(AVMetadataMachineReadableCodeObject *)metadata stringValue]; 
       break; 
      } 
     } 

     if (detectionString != nil) 
     { 
      if (isFirst) { 
      isFirst=false; 
      _label.text = detectionString; 
      break; 
      } 
     } 
     else 
      _label.text = @"(none)"; 
    } 

    _highlightView.frame = highlightViewRect; 
} 
+0

我的qrcodes被多次扫描如何纠正这个问题??当我尝试扫描一次,实际上我有一个警报视图后获得的价值,然后它移动到另一个页面,有时它得到价值4倍和4个警报视图来4次segues发生 – Akshay 2017-09-08 03:57:59

1

你可以用我自己的框架QRCodeReader

https://www.cocoacontrols.com/controls/qrcodereader

如何使用

  1. 嵌入式二进制
  2. 将在您的视图控制器下降的UIView。
  3. 改变UIVIw的类别。
  4. 绑定你的UIView。

粘贴 “M1,M2” 在您的视图控制器(即 “ViewController.m”)

“M1” 的viewDidLoad


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    self.title = @"QR Code Reader"; 
    [qrCodeView setDelegate:self]; 
    [qrCodeView startReading]; 
} 

而且这里的委托方法方法“M2”QRCodeReaderDelegate


#pragma mark - QRCodeReaderDelegate 
- (void)getQRCodeData:(id)qRCodeData { 
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"QR Code" message:qRCodeData preferredStyle:UIAlertControllerStyleAlert]; 

    UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Close" style:UIAlertActionStyleDefault handler:nil]; 
    [alertController addAction:cancel]; 

    UIAlertAction *reScan = [UIAlertAction actionWithTitle:@"Rescan" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 
     [qrCodeView startReading]; 
    }]; 
    [alertController addAction:reScan]; 
    [self presentViewController:alertController animated:YES completion:nil]; 
} 

谢谢。

+0

我使用xcode 7.3.1和swift 2,哪一个pod我安装它给我在运行时的lib文件中的错误。任何人都可以建议我应该使用哪个pod/lib? – Mubashar 2017-07-25 05:31:11