Skip to content

Delphi 11 – Android Permissions

Hasta Delphi 10.4, veníamos acostumbrados a un código para solicitar los permisos a nuestros usuarios en los dispositivos Android, pero esto ha cambiado en Delphi 11.

El ejemplo simple que venimos viendo en todas las web sobre Delphi, inclusive en los blog y Wiki de Embarcadero, es el siguiente:

procedure TFormMain.RequestPermissions;
begin
{$IFDEF ANDROID}
  FPermission_SEND := JStringToString(TJManifest_permission.JavaClass.SEND_SMS);
  FPermission_READ := JStringToString(TJManifest_permission.JavaClass.READ_SMS);
  FPermission_RECEIVE := JStringToString(TJManifest_permission.JavaClass.RECEIVE_SMS);
  PermissionsService.RequestPermissions([FPermission_SEND, FPermission_READ, FPermission_RECEIVE], RequestResult, DisplayRationale)
{$ENDIF}
end;
 
procedure TFormMain.RequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
{$IFDEF ANDROID}
  if (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then
  begin

  end
{$ENDIF}
end;

Hasta aquí todo bién, pero una vez lanzada la versión 11 de Delphi, decidí actualizar mis App, y me doy que al pasar el proyecto a la nueva versión me generaba el siguiente error:

[DCC Error] Unit.pas(305): E2250 There is no overloaded version of ‘RequestPermissions’ that can be called with these arguments.

Solución al error

El error nos dice que “No hay una versión sobrecargada de ‘RequestPermissions’ a la que se pueda llamar con estos argumentos”.

Simplemente nos quiere decir que en Delphi 11, los argumentos de dicho procediemiento han cambiado y deberemos declararlo de la siguiente manera:

procedure TFormMain.RequestResult(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
begin
  if (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) and (AGrantResults[2] = TPermissionStatus.Granted) then
  begin

  end;
end;