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(AVMetadataObjectTypeUPCECode)then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap(( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeCode39Code) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap(( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeCode39Mod43Code) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap(( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeEAN13Code) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap(( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeEAN8Code) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap(( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeCode93Code) 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(AVMetadataObjectTypePDF417Code) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap(( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeAztecCode) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap(( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeInterleaved2of5Code) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap(( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeITF14Code) then
begin
QRCode := TAVMetadataMachineReadableCodeObject.Wrap(( metadata as ILocalObject ).GetObjectID ).stringValue;
DoOnScan( NSStrToStr( QRCode ) );
break;
end
else if metadata.&type.isEqualToString(AVMetadataObjectTypeDataMatrixCode) then
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?
maybe is to late, but i hope will be usefull for anyone who have similar problem,
you have to add AVMetadataObjectTypePDF417 in section
procedure TDPFQRCodeScanner.CreateUIControl;
after
ObjTypes.addObject( ( AVMetadataObjectTypeQRCode as ILocalObject ).GetObjectID );
add this
ObjTypes.addObject( ( AVMetadataObjectTypePDF417Code as ILocalObject ).GetObjectID );
then in section
procedure TCaptureDelegate.captureOutput
change this line
if metadata.&type.isEqualToString(AVMetadataObjectTypeQRCode) then
become
if (metadata.&type.isEqualToString(AVMetadataObjectTypeQRCode)) or (metadata.&type.isEqualToString(AVMetadataObjectTypePDF417Code)) then
FYI. i use DPF component for Delphi Rio Run On Device iOS 12.1