IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

[IOS/Android] Envoi d'images par SMTP


Sujet :

Composants FMX Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Décembre 2021
    Messages : 164
    Points : 187
    Points
    187
    Par défaut [IOS/Android] Envoi d'images par SMTP
    Bonjour,

    Je suis en train de chercher une solution pour envoyer (de façon automatique) une photo choisie au préalable par l'utilisateur.

    Pour ce qui est de l'ouverture de la galerie et de la sélection c'est OK, j'ai déjà la fonction d'envoi d'email qui n'attend plus qu'un paramètre -> Le chemin qui mène à la photo choisie..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    procedure TForm1.BtCameraClick(Sender: TObject);
    var
      ImageService: IFMXTakenImageService;
      Params: TParamsPhotoQuery;
    begin
      PermissionsService.RequestPermissions([PermissionCamera, PermissionReadExternalStorage, PermissionWriteExternalStorage],TakePicturePermissionRequestResult, DisplayRationale)
    End;
    //------------------------------------------------------------------------------>
    procedure TForm1.TakePicturePermissionRequestResult(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
    var
      ImageService: IFMXTakenImageService;
      Params: TParamsPhotoQuery;
    Begin
      Try
      if TPlatformServices.Current.SupportsPlatformService(IFMXTakenImageService,
        IInterface(ImageService)) then
      begin
        //Params.RequiredResolution := TSize.Create(640, 640);
        Params.OnDidFinishTaking := DoDidFinish;
        ImageService.TakeImageFromLibrary(BtCamera, Params);
      end;
      Except
        ShowMessage('Cannot take a photo because the required permissions are not all granted');
      End;
    End;
    //------------------------------------------------------------------------------>
    procedure TForm1.DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
    begin
      var RationaleMsg: string;
     
      for var I := 0 to High(APermissions) do
      begin
        if APermissions[I] = PermissionCamera then
          RationaleMsg := RationaleMsg + 'The app needs to access the camera to take a photo' + SLineBreak + SLineBreak
        else if APermissions[I] = PermissionReadExternalStorage then
          RationaleMsg := RationaleMsg + 'The app needs to read a photo file from your device';
      end;
     
      // Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response!
      // After the user sees the explanation, invoke the post-rationale routine to request the permissions
      ShowMessage(RationaleMsg);
    end;
    //------------------------------------------------------------------------------>
    procedure TForm1.DoDidFinish(Image: TBitmap);
    Var Chemin : String;
    begin
     
    end;
     
    procedure TForm1.DoMessageListener(const Sender: TObject; const M: TMessage);
    begin
      if M is TMessageDidFinishTakingImageFromLibrary then
        Image1.Bitmap.Assign(TMessageDidFinishTakingImageFromLibrary(M).Value);
     
    end;
    Il y a un peu du sample fournit par Embarcadero, et un peu de la doc présente sur le site également, j'ai aussi trouvé TMessageReceivedImagePath dans la doc qui semble être ce que je recherche mais je n'arrive pas à m'en servir .

    PS: Je tiens vraiment à envoyer l'image sans passer par la méthode de partage conventionnel qui laisse le choix à l'utilisateur, le but est d'automatiser une tache qui est effectuer à part après chaque formulaire rempli.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pourquoi utiliser un chemin, si l'image finalement est présente dans Image1.Bitmap., tu peux utiliser un TMemorystream+TIdAttachment/atStream et un GUID pour le nom, on trouve même sur le net une classe TIdAttachmentStream qui facilite l'utilisation


    Sinon tu as oublie de gérer le FMX.Platform.TMessageReceivedImagePath dans le DoMessageListener (potentiellement spécifique à Android)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.DoMessageListener(const Sender: TObject; const M: TMessage);
    begin
      if M is TMessageDidFinishTakingImageFromLibrary then
        Image1.Bitmap.Assign(TMessageDidFinishTakingImageFromLibrary(M).Value)
     else if M is TMessageReceivedImagePath then
       FPathImage :=  TMessageReceivedImagePath(M).Value
    end;

    Mais tout ça n'est que théorique en lisant la Doc, je ne fais pas de FMX

    Et en théorie, tu dois l'ajouter pour le listener,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TMessageManager.DefaultManager.SubscribeToMessage(TMessageDidFinishTakingImageFromLibrary, DoMessageListener);
    TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedImagePath, DoMessageListener);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Il existe une action standard pour ça et elle gère les événements de retour de l'action.
    Il faut l'exécuter après avoir testé les permissions (pour Android), mais en dehors de ce point de détail ça devrait te simplifier la tâche de récupération du bitmap. Une fois fait tu en fais ce que tu veux.

    Possible aussi qu'un droit soit nécessaire comme pour le TakePhotoFromCamera en plus des permissions.

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Décembre 2021
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    Pourquoi utiliser un chemin, si l'image finalement est présente dans Image1.Bitmap., tu peux utiliser un TMemorystream+TIdAttachment/atStream et un GUID pour le nom, on trouve même sur le net une classe TIdAttachmentStream qui facilite l'utilisation
    À vrai dire, je n'y ai simplement pas pensé . Je ne pensais pas que l'on pouvait transformer un bitmap en pièce jointe de cette manière, et il me semblait bien que cette fonction n'était valable que pour Android.. Du coup, elle m'intéresse beaucoup moins, j'ai commencé à chercher, mais je ne trouve pas d'exemple de TMemorystream+TIdAttachment/atStream pour le moment, je vais regarder la doc Indy, à force de farfouiller, je finirais bien par trouver !

    Il existe une action standard pour ça et elle gère les événements de retour de l'action.
    Si je comprend bien le lien cette ligne de code n'est valable que sur Android?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PermissionsService.RequestPermissions([PermissionCamera, PermissionReadExternalStorage, PermissionWriteExternalStorage],TakePicturePermissionRequestResult, DisplayRationale)
    Tandis qu'un TActionList peut se déclencher peu importe la plateforme c'est bien ça ?

    Pour ce qui est de l'autorisation de prendre une photo je ne l'ai pas utilisé volontairement car le formulaire ne peut être rempli qu'après avoir pris la ou les photos

  5. #5
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par PetitBoutDeCode Voir le message
    Si je comprend bien le lien cette ligne de code n'est valable que sur Android?
    Tandis qu'un TActionList peut se déclencher peu importe la plateforme c'est bien ça ?
    Du tout : Embarcadero a bien fait les choses. Le système de permissions est actif pour Android et transparent pour les autres plateformes. Sur Android ça appelle les API. Pour les autres ça te dit que tu as l'autorisation, donc pas besoin de conditionner le code à la plateforme.

    Citation Envoyé par PetitBoutDeCode Voir le message
    Pour ce qui est de l'autorisation de prendre une photo je ne l'ai pas utilisé volontairement car le formulaire ne peut être rempli qu'après avoir pris la ou les photos
    Je pensais plus au droit "partage de fichiers sécurisés" qui est peut-être aussi nécessaire avec les permissions d'accès à la bibliothèque de photos. A vérifier sur un Android récent qui acceptera l'appel ou te mettra une erreur JAVA.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Décembre 2021
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    A force de bidouiller et lire la doc j'ai fini par comprendre! Le TActionList joue un peu le même rôle qu'un TOpenDialog sous Windows en fait (avec beaucoup plus de possibilités)

    L'utilisation est assez simple : on pose un TActionList sur une fiche, on ajoute les actions et actions standards qui nous intéressent et on les attache aux éléments d'interface ou on appelle leur méthode Execute.
    C'est cette partie la que je n'avais pas bien compris sur le lien quand tu parles d'ajouter les actions qui nous intéressent, En fait il fallait faire un double click sur le composant, j'ai loupé la toute première étape

    Une fois cette étape passée, j'ai trouvé la fonction Bitmap.SaveToFile qui me permet de l'enregistrer ou je veux pour l'attacher au mail avant de supprimer, c'est ce que j'ai trouvé de plus simple comme solution.

    Le seul problème qui subsiste, mais la je suis pas sur de pouvoir y faire grand chose, c'est la connexion, en 4G tout ce passe bien, mais sur un mauvais wifi indy plante, je vais surement mettre tout ça dans un Thread à part pour que ça reste fluide visuellement.

    En attendant, merci pour le coup de pouce

  7. #7
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par PetitBoutDeCode Voir le message
    Le seul problème qui subsiste, mais la je suis pas sur de pouvoir y faire grand chose, c'est la connexion, en 4G tout ce passe bien, mais sur un mauvais wifi indy plante, je vais surement mettre tout ça dans un Thread à part pour que ça reste fluide visuellement.
    Attention : seule la partie d'envoi de l'email peut (en fait doit) se faire en thread, le reste doit être dans le thread principal. Je dis ça au cas où.

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2021
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Décembre 2021
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    Attention : seule la partie d'envoi de l'email peut (en fait doit) se faire en thread, le reste doit être dans le thread principal. Je dis ça au cas où.
    C'est ce que j'ai fait! Mais finalement j'ai changé mon fusil d'épaule pour utiliser la fonction de partage sécurisé, en fait je peux y mettre le texte que je veux avec la propriété TextMessage, et ça règle problème de connexion, parce que le thread avec une mauvaise connexion a tourné 30min sans réussir à envoyer le mail ^^.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Envoi d'email par smtp avec C++ (Dev-Cpp)
    Par zeleyou dans le forum Dev-C++
    Réponses: 6
    Dernier message: 20/04/2015, 12h21
  2. Problème d'envoie de mail par SMTP
    Par yass dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 12/09/2008, 16h45
  3. [MySQL] Envoi d'images par formulaire et post-traitement
    Par mathieu7497 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 08/04/2006, 13h58
  4. Access 97 : Envoi de mail par SMTP sans Outlook
    Par mr_foxy dans le forum Access
    Réponses: 2
    Dernier message: 16/03/2006, 14h45
  5. [Mail] Envoi de mail par SMTP ?
    Par Borami dans le forum Langage
    Réponses: 1
    Dernier message: 03/01/2006, 12h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo