Se la applicazione che state creando, richiede una registrazione dell’utente per cui è utile avere anche la mail (già verificata) dell’utente del dispositivo, è possibile utilizzare le api fornite da Android per richiedere all’utente di loggarsi e concedere alla vostra app di catturarne la mail.
Grazie alla grande capacità di Delphi di interfacciarsi con le librerie native di ogni piattaforma target non è difficile implementare questa funzione all’interno dells ns app.
Ambiente su cui è stato eseguito il test:
– Android v. 8.0 up to 12
– Delphi 12.0 Alexandria Enterprise
Appicazione di destinazione: XtumbleRetail e XtumbleMagazzino disponibili sia su Android che IOS
Passi necessari per implementare la login utente:
1 – Includere le libreiriie necessarie;
uses
System.TypInfo, uFireDacHelper, uFrmMain,System.IOUtils,xtSOUtils,
DB, xtUtils, DateUtils,System.Permissions ,System.Messaging
{$IFDEF ANDROID}
,Androidapi.JNI.Os,Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText,
Androidapi.JNIBridge,Androidapi.JNI.Accounts,
Androidapi.JNI.App, FMX.Helpers.Android
{$ENDIF}
{$IFDEF IOS}
,DW.iOSapi.AuthenticationServices
,DW.iOSapi.Foundation
{$ENDIF}
{$IFDEF MSWINDOWS}
,ActiveX
{$ENDIF}, PasfrmLocalBrowseNew
2 – Abilitare la gestione account nelle option di progetto, che si andrà poi a rifletter sul file “manifest.xml”
.
.
3 – Sottoscrivere una funzione di gestione dell’evento asincrono dove l’utente accetta o meno di loggarsi
procedure TfrmSettings.FormCreate(Sender: TObject);
var
ff: TStringDynArray;
gg: String;
begin
TentativiDiLogin := 0;
{$IFDEF ANDROID}
TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityResult);
{$ENDIF}
end;
.
procedure TfrmSettings.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
{$IFDEF ANDROID}
TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, HandleActivityResult);
{$ENDIF}
end;
.
.
.
3 – Definire la funzione di gestione dell’evento di risposta all’azione utente
procedure TfrmSettings.HandleActivityResult(const Sender: TObject;
const M: TMessage);
var
requestCode, resultCode: Integer;
Data: JIntent;
begin
if M is TMessageResultNotification then
begin
requestCode := TMessageResultNotification(M).requestCode;
resultCode := TMessageResultNotification(M).resultCode;
Data := TMessageResultNotification(M).Value as JIntent;
if requestCode = ADD_ACCOUNT_REQUEST_CODE then
begin
if resultCode = TJActivity.JavaClass.RESULT_OK then
begin
// lblCreateNewAccountClick(nil);
// Puoi eseguire qui le azioni necessarie dopo che l'utente ha aggiunto l'account
// Ad esempio, recuperare le informazioni sull'account da AccountManager
// data contiene i dati restituiti dall'attività di scelta dell'account
end
else
begin
If TentativiDiLogin = 0 then
begin
TentativiDiLogin := 1;
// sleep(4000);
// lblCreateNewAccountClick(nil);
end
Else
lblCreateNewAccount.Enabled := True;
// L'utente ha annullato l'aggiunta dell'account
// Puoi gestire questa situazione di conseguenza
end;
end;
end;
end;
.
3 – Definire la funzione principale che scatena l’evento di login
function TfrmSettings.requireUserMail: String;
var
AccountManager: JAccountManager;
Accounts: TJavaObjectArray<JAccount>;
addAccountIntent: JIntent;
accountTypesDef:TJavaObjectArray<JString>;
accountType: JString;
begin
result := AccountEmail;
if result <> '' then exit;
{$IFDEF ANDROID}
PermissionsService.RequestPermissions
([JStringToString(TJManifest_permission.JavaClass.GET_ACCOUNTS)],
procedure(const APermissions: TClassicStringDynArray; // TArray<string>;
const AGrantResults: TClassicPermissionStatusDynArray
// TArray<TPermissionStatus>
)
begin
if (Length(AGrantResults) = 1) and
(AGrantResults[0] = TPermissionStatus.Granted) then
begin
AccountManager := TJAccountManager.JavaClass.get
(TAndroidHelper.Context);
Accounts := AccountManager.getAccountsByType
(StringToJString('com.google'));
if Accounts.Length > 0 then
begin
// Prendi il primo account Google e recupera l'email
var
Email := JStringToString(Accounts[0].Name);
AccountEmail := Email;
end
else
begin
accountType := StringToJString('com.google'); // Specifica il tipo di account, ad esempio, Google
accountTypesDef:=TJavaObjectArray<JString>.Create(1);
accountTypesDef.Items[0] := accountType;
addAccountIntent := TJAccountManager.JavaClass.newChooseAccountIntent(nil, nil,
accountTypesDef, False, nil, nil, nil, nil);
addAccountIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
TAndroidHelper.Activity.startActivityForResult(addAccountIntent, ADD_ACCOUNT_REQUEST_CODE);
end;
end
else
begin
end;
end);
{$ENDIF}
end;
4 – Testare l’appliazione
