在上一篇文章中,详细说明了使用DELPHI 11在VCL和FMX模式下,如何根据文本内容生成二维码。

在此文中,我们一起来探讨一下如何通过DELPHI 11实现二维码的扫描

主要步聚说明:
1.下载ZXing库
2.安装ZXing库
3.创建实例实现扫描功能

废话不多说,直接进入主题

【下载ZXing库】
此库在GitCode网站上可以下载,但我失败了很多次才成功,而且下载以后还要稍微修改一下,我把修改后的成品重新上传了一下,地址如下:

【安装ZXing库】
为了照顾新人,我把安装的具体步骤也进行说明

第一步:打开DELPHI 11,并新建Packgge

android14 PMS 开机扫描_智能手机


第二步:按下图操作

android14 PMS 开机扫描_android14 PMS 开机扫描_02


第三步:选择下载的ZXing库路径,并按Ctrl + A进行全选,并导入

android14 PMS 开机扫描_android14 PMS 开机扫描_03

导入成功后可以看到文件清单内容

android14 PMS 开机扫描_智能手机_04


第四步:点击红框位置按右键,选择安装

android14 PMS 开机扫描_android_05

安装过程中所有提示框全部按OK就可以,直到提示安装成功,那么ZXing库就成功完成了安装

android14 PMS 开机扫描_智能手机_06


第五步:增加搜索路径,否则无法引用库单元

android14 PMS 开机扫描_android_07


android14 PMS 开机扫描_android_08


点击红框标识的文件夹图标,将下载的ZXing库文件路径加入进来后,点ADD。重点注意:下面红框位置的每一个都要按上面的路径设定一次

android14 PMS 开机扫描_android_09


至此为止,我们的库才算是全部安装完成,可以在DELPHI 中正常引用了

我们可以随便打开一个新的工程测试一下,点击到单元文件中,输入“ZXing”

就可以看到所有的单元提示,这说明库文件引用成功

android14 PMS 开机扫描_delphi_10


【创建扫码实例】

下面我们通过一个简单的实例的来调用ZXing库,并在安卓手机上实现扫描功能

首先我们新建一个工程,并在界面上放上Image1,Memo1,Button1,CameraComponent1,大概的界面如下图所示

android14 PMS 开机扫描_android_11


此实例功能比较简单,主要分为两个部分

1.因为要使用相机,所以要申请相机使用权限

2.打开相机,识别条码,并将条码内容显示在MEMO1中

【申请相机权限】
先设置一个变量

private
    { Private declarations }
    fPermissionCamera: String;

并且需要引用以下单元

Uses
zxing.BarcodeFormat,
zxing.ScanManager,
zxing.ReadResult,
system.Permissions,
androidapi.Jni.Os,
androidapi.Helpers;

整个代码如下所示:

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,zxing.BarcodeFormat,zxing.ScanManager,zxing.ReadResult,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types,fmx.Media,system.Permissions,fmx.DialogService,fmx.Platform,
  FMX.Objects, FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,androidapi.Jni.Os,androidapi.Helpers;

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Image1: TImage;
    CameraComponent1: TCameraComponent;
    procedure Button1Click(Sender: TObject);
    procedure CameraPermissionRequestResult(Sender: TObject;
      const APermissions: TClassicStringDynArray;
      const AGrantResults: TClassicPermissionStatusDynArray);
    procedure ExplainReason(Sender: TObject; const APermissions: TClassicStringDynArray;
      const APostRationaleProc: TProc);
    procedure FormCreate(Sender: TObject);
    procedure CameraComponent1SampleBufferReady(Sender: TObject;
      const ATime: TMediaTime);
  private
    { Private declarations }
    fPermissionCamera: String;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation


{$R *.fmx}


procedure TForm2.CameraPermissionRequestResult(Sender: TObject;
  const APermissions: TClassicStringDynArray;
  const AGrantResults: TClassicPermissionStatusDynArray);

begin
  if (Length(AGrantResults) = 1) and
    (AGrantResults[0] = TPermissionStatus.Granted) then
  begin
    CameraComponent1.Active := false;
    CameraComponent1.Quality := FMX.Media.TVideoCaptureQuality.HighQuality;
    CameraComponent1.Kind := FMX.Media.TCameraKind.BackCamera;
    CameraComponent1.FocusMode := FMX.Media.TFocusMode.ContinuousAutoFocus;
    CameraComponent1.Active := True;
    Memo1.Lines.Clear;
  end
  else
    TDialogService.ShowMessage('相机使用未授权,无法扫描条码')
end;


procedure TForm2.ExplainReason(Sender: TObject;
  const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
begin

  TDialogService.ShowMessage('软件需要相机使用权限来扫描条码',
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)

end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  fPermissionCamera := JStringToString(TJManifest_permission.JavaClass.CAMERA);
end;



procedure TForm2.CameraComponent1SampleBufferReady(Sender: TObject;
  const ATime: TMediaTime);
begin
   TThread.Synchronize(TThread.CurrentThread,
   procedure
   begin
      CameraComponent1.SampleBufferToBitmap(Image1.Bitmap, True);
   end);
end;

procedure TForm2.Button1Click(Sender: TObject);
var
   ReadResult:TReadResult;
   SCanManager:TScanManager;
begin
  PermissionsService.RequestPermissions([fPermissionCamera],
    CameraPermissionRequestResult, ExplainReason);

   SCanManager:=TScanManager.Create(TBarcodeFormat.Auto,nil);
   ReadResult:=SCanManager.Scan(Image1.Bitmap);

   if ReadResult <> nil then
   begin
      Memo1.Text:=ReadResult.text;
   end;

end;

end.

然后我们编译运行,试试功能怎么样

android14 PMS 开机扫描_android14 PMS 开机扫描_12


完美识别二维码,并将信息传给了MEMO1

当然这只是最简单的例子,只是演示一下如何识别条码,更多的条码处理功能,比如优化,提速等需要在后面继续。

怎么样,是不是很简单,够不够详细,有句话怎么说来的?能给新人看懂的教程才是好教程,自我陶醉结束,文章介绍结束,当然学习和分享没有结束

欲知后事如何,请听下回分解。