Delphi v11 安卓权限申请

问题

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

原因

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

Delphi 复制代码
procedure TDmBLE.RequestPermissionsResult(Sender: TObject;  const APermissions: TArray<string>;  const AGrantResults: TArray<TPermissionStatus>);

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

  1. TArray<string> 更改为:TClassicStringDynArray

  2. TArray<TPermissionStatus> 更改为:TClassicPermissionStatusDynArray

Delphi 复制代码
procedure DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);

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

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

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

Delphi 复制代码
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 方法,用于调用这个模块的地方,当用户在申请权限的界面上通过了权限申请后,要执行的代码,通过这个事件方法调用。

相关推荐
用户693717500138427 分钟前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android1 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才2 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶2 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle
汪海游龙2 小时前
开源项目 Trending AI 招募 Google Play 内测人员(12 名)
android·github
qq_283720053 小时前
MySQL技巧(四): EXPLAIN 关键参数详细解释
android·adb
没有了遇见4 小时前
Android 架构之网络框架多域名配置<三>
android
myloveasuka5 小时前
[Java]单列集合
android·java·开发语言
fundroid6 小时前
Room 3.0 完全解析:一次面向未来的现代化重构
android·数据库·database·kmp
漂洋过海来看你啊6 小时前
Jetpack Compose高效列表实战:状态管理与性能优化指南
android