Delphi v11 安卓权限申请

问题

Delphi 10.4 的安卓权限申请代码,在 Delphi 11 下面编译无法通过。

原因

原因是里面有几个变量类型的定义有所不同。

procedure TDmBLE.RequestPermissionsResult(Sender: TObject;  const APermissions: TArray<string>;  const AGrantResults: TArray<TPermissionStatus>);

上述代码是 Delphi 10.4 的,里面有两个类型需要更改:

1. TArray<string> 更改为:TClassicStringDynArray

2. TArray<TPermissionStatus> 更改为:TClassicPermissionStatusDynArray

procedure DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);

同样,上面这个函数里面的 TArray<string> 更改为:TClassicStringDynArray;

适用于 Delphi 11 的安卓权限动态申请的完整代码

我把代码封装到一个单独的 DataModule 里面了。这样方便在不同的项目里重复使用。

unit UDmPermissions;
// 安卓的权限申请代码 Delphi 11
interface

uses
  System.SysUtils, System.Types, System.Classes, System.Permissions, FMX.DialogService, System.UITypes;

type
  TDmPermissions = class(TDataModule)
  private
    { Private declarations }
    FGotPermission: TNotifyEvent;

    procedure RequestPermissionsResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
    procedure DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);

    procedure DoGotPermissions;
  public
    { Public declarations }

    property OnGotPermissions: TNotifyEvent read FGotPermission write FGotPermission;
  end;

var
  DmPermissions: TDmPermissions;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

{ TDmPermissions }

procedure TDmPermissions.DisplayRationale(Sender: TObject;
  const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
begin
  //Rationale: 理由
  TDialogService.ShowMessage('We need to be given permission to discover BLE devices',
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc;
    end)
end;

procedure TDmPermissions.DoGotPermissions;
begin
  if Assigned(FGotPermission) then FGotPermission(Self);
end;

procedure TDmPermissions.RequestPermissionsResult(Sender: TObject;
  const APermissions: TClassicStringDynArray;
  const AGrantResults: TClassicPermissionStatusDynArray);
begin
  if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
    Self.DoGotPermissions
  else
    TDialogService.ShowMessage('Cannot start BLE scan as the permission has not been granted');
end;

end.

又及:

上述代码中,DoGotPermissions 方法,用于调用这个模块的地方,当用户在申请权限的界面上通过了权限申请后,要执行的代码,通过这个事件方法调用。

相关推荐

  1. Delphi v11 权限申请

    2024-02-20 14:06:01       28 阅读
  2. 权限预置设置

    2024-02-20 14:06:01       12 阅读
  3. android11 申请所有文件访问权限

    2024-02-20 14:06:01       15 阅读
  4. 11修改power按键功能

    2024-02-20 14:06:01       31 阅读
  5. kotlin面试题 101-105

    2024-02-20 14:06:01       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-20 14:06:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-20 14:06:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-20 14:06:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-20 14:06:01       20 阅读

热门阅读

  1. 华为HCIA课堂笔记第十章 以太网链路聚合

    2024-02-20 14:06:01       25 阅读
  2. Spring boot 实现监听 Redis key 失效事件

    2024-02-20 14:06:01       34 阅读
  3. 网络安全之信息收集<五>

    2024-02-20 14:06:01       28 阅读
  4. 计算机网络第四章问答题

    2024-02-20 14:06:01       24 阅读
  5. 四、通信和网络安全—网络通信模型(CISSP)

    2024-02-20 14:06:01       27 阅读
  6. sqlserver 事务

    2024-02-20 14:06:01       26 阅读
  7. 【leetcode】常用数学题解法介绍

    2024-02-20 14:06:01       27 阅读