Via Cà Matta 2 - Peschiera Borromeo (MI)
+39 02 00704272
info@synaptica.info

Delphi Android Tip – Get Account info from SO

Digital Innovation Partner

Delphi Android Tip – Get Account info from SO

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