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;