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

相关推荐
努力学习的小廉26 分钟前
初识MYSQL —— 事务
android·mysql·adb
阿里云云原生43 分钟前
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
android
.豆鲨包44 分钟前
【Android】Android内存缓存LruCache与DiskLruCache的使用及实现原理
android·java·缓存
JulyYu2 小时前
【Android】针对非SDK接口的限制解决方案
android·客户端
猪哥帅过吴彦祖2 小时前
Flutter 系列教程:应用导航 - Navigator 1.0 与命名路由
android·flutter·ios
2501_916008893 小时前
iOS 跨平台开发实战指南,从框架选择到开心上架(Appuploader)跨系统免 Mac 发布全流程解析
android·macos·ios·小程序·uni-app·iphone·webview
stevenzqzq4 小时前
Android Hilt教程_构造函数
android
鹏多多4 小时前
flutter图片选择库multi_image_picker_plus和image_picker的对比和使用解析
android·flutter·ios
GISer_Jing4 小时前
Flutter开发全攻略:从入门到精通
android·前端·flutter