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

相关推荐
alexhilton11 小时前
面向开发者的系统设计:像建筑师一样思考
android·kotlin·android jetpack
CYRUS_STUDIO20 小时前
用 Frida 控制 Android 线程:kill 命令、挂起与恢复全解析
android·linux·逆向
CYRUS_STUDIO20 小时前
Frida 实战:Android JNI 数组 (jobjectArray) 操作全流程解析
android·逆向
用户091 天前
Gradle Cache Entries 深度探索
android·java·kotlin
循环不息优化不止1 天前
安卓 View 绘制机制深度解析
android
叽哥1 天前
Kotlin学习第 9 课:Kotlin 实战应用:从案例到项目
android·java·kotlin
雨白1 天前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
诺诺Okami2 天前
Android Framework-Launcher-UI和组件
android
潘潘潘2 天前
Android线程间通信机制Handler介绍
android
潘潘潘2 天前
Android动态链接库So的加载
android