You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11.3 Android多权限请求代码编译报错求助

Delphi 11.3 Android权限申请编译错误解决

错误原因分析

你遇到的两个E2250编译错误,本质都是参数类型不匹配,具体原因如下:

1. RequestPermissions报错

PermissionsService.RequestPermissions的第一个参数要求是TArray<string>类型的权限列表,但你代码中的Permissions变量要么未定义,要么类型不符合要求。系统无法识别该参数的类型,因此抛出重载不匹配错误。

2. MessageDialog报错

可能存在两种情况:

  • 未正确引用FMX.DialogService单元,导致编译器找不到正确的方法重载;
  • 你的DataModule是VCL类型而非FireMonkey类型,VCL与FMX的对话框服务方法签名存在差异,引发参数不匹配。

修正后的完整代码

unit udmMain;

interface

uses
  System.SysUtils, System.Classes, FMX.DialogService, FMX.PermissionsService, System.Permissions;

type
  TdmMain = class(TDataModule)
  private
    { Private declarations }
  public
    procedure SetPermissions;
  end;

var
  dmMain: TdmMain;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

procedure TdmMain.SetPermissions;
const
  Explanation: string = '需要以下权限以正常使用应用功能:相机、存储访问';
  // 定义需要申请的Android权限数组,使用系统常量避免拼写错误
  Permissions: TArray<string> = [
    JStringToString(TJManifest_permission.JavaClass.CAMERA),
    JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)
  ];
begin
  TDialogService.MessageDialog(Explanation, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbOK], TMsgDlgBtn.mbOK, 0,
    procedure(const AResult: TModalResult)
    begin
      if AResult = TModalResult.mrOK then
      begin
        PermissionsService.RequestPermissions(Permissions,
          procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
          var
            I: Integer;
          begin
            // 遍历所有权限,逐个检查授予状态
            for I := 0 to High(AGrantResults) do
            begin
              if AGrantResults[I] = TPermissionStatus.Granted then
              begin
                // 权限已授予,执行对应逻辑
                // 示例:ShowMessage(APermissions[I] + ' 权限已授予');
              end
              else
              begin
                // 权限未授予,执行对应逻辑
                // 示例:ShowMessage(APermissions[I] + ' 权限未授予');
              end;
            end;
          end
        );
      end;
    end
  );
end;

end.

关键修正点

  • 引用必要单元:确保添加FMX.DialogService、FMX.PermissionsService、System.Permissions三个单元;
  • 明确权限数组:用TArray<string>类型定义权限列表,推荐使用TJManifest_permission中的系统常量,避免手动拼写错误;
  • 检查DataModule类型:确认DataModule是FireMonkey类型(创建时选择FireMonkey DataModule),适配Android应用的框架要求;
  • 完善权限结果处理:遍历所有权限的授予状态,而非仅检查第一个,适配多权限申请场景。

内容的提问来源于stack exchange,提问作者Franz Andreani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:22:46