I am using TDPFQRCodeScanner to read bar codes. It's unable to read all kinds of bar codes. I have updated the "CreateUIControl" and "CaptureOutput" procedures of the DPF components BarCodeReader class as:
procedure TDPFQRCodeScanner.CreateUIControl;
{$IFDEF IOS}
var
device : AVCaptureDevice;
error : Pointer;
input : AVCaptureDeviceInput;
LOutput : AVCaptureMetadataOutput;
ObjTypes: NSMutableArray;
{$ENDIF}
begin
{$IFDEF IOS}
if Assigned( FNativeControl ) then
Exit;
FNativeControl := TUIView.Create;
FUIControl := FNativeControl;
if IsCameraAvailable then
begin
FSession := TAVCaptureSession.Create;
device := TAVCaptureDevice.Wrap( TAVCaptureDevice.OCClass.defaultDeviceWithMediaType( AVMediaTypeVideo ) );
error := nil; input := TAVCaptureDeviceInput.Wrap( TAVCaptureDeviceInput.OCClass.deviceInputWithDevice( device, @error ) ); if Assigned( input ) then FSession.addInput( input ) else begin if Assigned( FOnError ) and Assigned( error ) then FOnError( Self, error ); end; LOutput := TAVCaptureMetadataOutput.Wrap( TAVCaptureMetadataOutput.Wrap( TAVCaptureMetadataOutput.OCClass.alloc ).init ); FSession.addOutput( LOutput ); // important: must be done before setting metadata object types! ObjTypes := TNSMutableArray.Create; // TNSMutableArray.Wrap(TNSMutableArray.OCClass.arrayWithObject((AVMetadataObjectTypeQRCode as ILocalObject).GetObjectID)); //ObjTypes.addObject( ( AVMetadataObjectTypeQRCode as ILocalObject ).GetObjectID ); ObjTypes.addObject((AVMetadataObjectTypeUPCECode as ILocalObject).GetObjectID); ObjTypes.addObject((AVMetadataObjectTypeCode39Code as ILocalObject).GetObjectID); ObjTypes.addObject((AVMetadataObjectTypeCode39Mod43Code as ILocalObject).GetObjectID); ObjTypes.addObject((AVMetadataObjectTypeEAN13Code as ILocalObject).GetObjectID); ObjTypes.addObject((AVMetadataObjectTypeEAN8Code as ILocalObject).GetObjectID); ObjTypes.addObject((AVMetadataObjectTypeCode93Code as ILocalObject).GetObjectID); ObjTypes.addObject( ( AVMetadataObjectTypeCode128Code as ILocalObject ).GetObjectID ); ObjTypes.addObject((AVMetadataObjectTypePDF417Code as ILocalObject).GetObjectID); ObjTypes.addObject((AVMetadataObjectTypeAztecCode as ILocalObject).GetObjectID); ObjTypes.addObject((AVMetadataObjectTypeInterleaved2of5Code as ILocalObject).GetObjectID); ObjTypes.addObject((AVMetadataObjectTypeITF14Code as ILocalObject).GetObjectID); ObjTypes.addObject((AVMetadataObjectTypeDataMatrixCode as ILocalObject).GetObjectID); LOutput.setMetadataObjectTypes( ObjTypes ); LOutput.setMetadataObjectsDelegate( ( FDelegate as ILocalObject ).GetObjectID, dispatch_get_main_queue( ) ); LOutput.release; LOutput := nil; Fpreview := TAVCaptureVideoPreviewLayer.Wrap( TAVCaptureVideoPreviewLayer.OCClass.layerWithSession( FSession ) ); Fpreview.setVideoGravity( AVLayerVideoGravityResizeAspectFill ); Fpreview.setframe( CGRectMake( 0, 0, FNativeControl.frame.size.width, FNativeControl.frame.size.height ) ); UpdateOrientation; FNativeControl.layer.insertSublayer( FPreview, 0 );
end;
{$ENDIF}
inherited CreateUIControl;
end;
procedure TCaptureDelegate.captureOutput( captureOutput: AVCaptureOutput; didOutputMetadataObjects: NSArray; fromConnection: AVCaptureConnection );
var
QRCode : NSString;
metadata: AVMetadataObject;
I : Integer; //AVMetadataObjectTypeQRCode or
begin
for I := 0 to didOutputMetadataObjects.count - 1 do
begin
metadata := TAVMetadataObject.Wrap( didOutputMetadataObjects.objectAtIndex( I ) );
if metadata.&type.isEqualToString(AVMetadataObjectTypeCode128Code)then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap( ( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeCode128Code) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap( ( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeCode128Code) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap( ( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap( ( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end;
// NSLog(@"QR Code: %@", QRCode);
end;
end;
But it's not working for me. Can you please guide me through it?