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 :

[Rio] Envoi de mail avec ZIP ne fonctionne plus [Android]


Sujet :

Composants FMX Delphi

  1. #1
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut [Rio] Envoi de mail avec ZIP ne fonctionne plus
    Bonjour la communauté,

    J'ai une fonctionnalité basique qui me pose problème. Sur mon appli, je souhaite envoyer un email avec un fichier zip joint.

    Cette fonctionnalité ne posait aucun problème sous Tokyo avec mes devices (Android 6.0, Android 8.0 et 8.1).

    Je suis passé sous Rio et là ça ne fonctionne plus sur mes devices Android 8.0 et 8.1

    Ci-dessous le procédure d'envoi de mail avec pièce jointe zip (chemin contenu dans la variable _Attachment) :

    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
    procedure CreateEmail(const _Recipient, _Subject, _Content, _Attachment: string);
    var JRecipient: TJavaObjectArray<JString>;
        Intent    : JIntent;
        Uri       : Jnet_Uri;
        AttachmentFile: JFile;
    begin
      JRecipient          := TJavaObjectArray<JString>.Create(1);
      JRecipient.Items[0] := StringToJString(_Recipient);
     
      Intent := TJIntent.Create;
      Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
      Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, JRecipient);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(_Subject));
      Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(_Content));
     
      if (_Attachment <> '') then
      begin
        AttachmentFile:= TJFile.JavaClass.init(StringToJString(_Attachment));
        Uri           := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
        Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((Uri as ILocalObject).GetObjectID));
      end;
     
      Intent.setType(StringToJString('vnd.android.cursor.dir/email'));
     
      SharedActivity.startActivity(Intent);
    end;
    Avec ce code, le client de messagerie ne s'ouvre pas, l'appli ferme sans aucun message d'erreur. Le fichier Zip est disponible sur le stockage.
    Si je retire la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((Uri as ILocalObject).GetObjectID));
    l'ouverture du client de messagerie s'ouvre, le message est remplit mais bien sûr il n'y a pas de pièce jointe.

    Dois-je rajouter quelque chose dans le manifest ?

    Je me dis que quelque chose a été modifié mais pas beaucoup d'info sur la doc Intent d'Android...

    Merci pour vos commentaires

    Lefju

    PS
    Il manque le free de Intent mais j'y travaille

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 511
    Points : 2 783
    Points
    2 783
    Billets dans le blog
    10
    Par défaut
    N'ayant pas encore installé RIO je ne peut te répondre. Mais juste en ce qui concerne la libération des objet dans ce cas là plutôt utiliser le "disposeOf" que "free" ou "destroy"

  3. #3
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut
    J'ai tenté l'utilisation d'une liste qui ne contiendait qu'une seule pièce jointe mais le résultat est identique, l'app ferme

    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
    var
      Intent: JIntent;
      Uri: Jnet_Uri;
      AttachmentFile: JFile;
      Uris: JArrayList;
    begin
      Intent := TJIntent.Create;
      Intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE);
      Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, StringToJString(_Recipient));
      Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(_Subject));
      Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(_Content));
     
      AttachmentFile := SharedActivity.getExternalFilesDir(StringToJString(_Attachment));
     
      Uri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
      Uris:= TJArrayList.Create;
      Uris.add(0,Uri);
     
      Intent.putParcelableArrayListExtra(TJIntent.JavaClass.EXTRA_STREAM, Uris);
     
      Intent.setType(StringToJString('vnd.android.cursor.dir/email'));
     
      SharedActivity.startActivity(Intent);
    Je ne vois pas pourquoi ça ne marche pas sur certains devices...

  4. #4
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut
    J'ai tenté une approche utilisée pour Berlin et j'e progresse...

    J'utilise une unité de KastriFree sur GitHub, l'application ne plante plus, le client mail s'ouvre avec ma pièce jointe mais j'ai une deuxième adresse email qui apparaît, elle affiche le chemin complet de ma pièce jointe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //com.embarcadero.MyApp.fileprovider/external_files/MyApp/Tmpdir/TmpFile.zip
    Pour retirer cette adresse de destination, j'ai utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIntent.removeExtra(TJIntent.JavaClass.EXTRA_EMAIL)
    mais rien n'y fait

    Ma procédure pour l'envoi de mail:

    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
    procedure CreateEmail(const _Recipient, _Subject, _Content, _Attachment: string);
    var
      LIntent: JIntent;
      LAuthority: JString;
      LUri: Jnet_Uri;
      JRecipient: TJavaObjectArray<JString>;
    begin
      LAuthority := StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName) + '.fileprovider');
      LUri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, LAuthority, TJFile.JavaClass.init(StringToJString(_Attachment)));
     
      LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND);
     
      JRecipient          := TJavaObjectArray<JString>.Create(1);
      JRecipient.Items[0] := StringToJString(_Recipient);
     
      LIntent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, JRecipient);
      LIntent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(_Subject));
      LIntent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(_Content));
      LIntent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((LUri as ILocalObject).GetObjectID)); // ajout de la pièce jointe
      LIntent.setDataAndType(LUri, StringToJString('vnd.android.cursor.dir/email'));
     
      TAndroidHelper.Activity.startActivity(LIntent);
    end;

  5. #5
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut
    Après quelques galères, nombreux essais, lecture assidue de l'aide Google, le code ci-dessous fonctionne parfaitement sous Rio.

    On peut créer une fonction à partir de cette procédure dont les entrées seront les @ emails (to, cc, bcc), le sujet, le contenu et la pièce jointe (zip, pdf ou autres).

    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
    procedure sendEmailClick(Sender: TObject);
    var
      sfilename:string;
      AttachmentFile: JFile;
      Intent: JIntent;
      AddressesTo: TJavaObjectArray<JString>;
      AddressesCC, AddressesBCC: TJavaObjectArray<JString>;
    begin
      Intent := TJIntent.Create;
      Intent.setAction(TJIntent.JavaClass.ACTION_SENDTO);
      Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('mailto:')));
     
      AddressesTo := TJavaObjectArray<JString>.Create(2);
      AddressesTo.Items[0] := StringToJString('mail2@anydomain.com');
      AddressesTo.Items[1] := StringToJString('mail3@anydomain.com');
     
      AddressesCC := TJavaObjectArray<JString>.Create(1);
      AddressesCC.Items[0] := StringToJString('mail4@anydomain.com');
     
      AddressesBCC := TJavaObjectArray<JString>.Create(1);
      AddressesBCC.Items[0] := StringToJString('mail5@anydomain.com');
     
      Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, AddressesTo);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_CC, AddressesCC);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_BCC, AddressesBCC);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString('Any subject'));
      Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('Hi I send this mail!' + sLineBreak +  'bye'));
     
      sFileName := System.IOUtils.TPath.GetSharedDownloadsPath + PathDelim + 'anyfile.pdf';
      if sFileName <> '' then
      begin
        AttachmentFile := TJFile.JavaClass.init(StringToJString(sFileName));
        Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((TJnet_Uri.JavaClass.fromFile(AttachmentFile) as ILocalObject).GetObjectID));
      end;
      SharedActivity.startActivity(Intent);
    end;

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 288
    Points : 41 747
    Points
    41 747
    Billets dans le blog
    65
    Par défaut

    ce serait peut-être bien de mettre ce code en FAQ Delphi FMX
    Toutefois, je remarque que ton code propose l'envoi d'un PDF et non d'un Zip comme dans le titre de la discussion donc, questionnement (bête) , ça fonctionne aussi pour un zip ?

  7. #7
    Membre régulier
    Développeur informatique
    Inscrit en
    Décembre 2010
    Messages
    228
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 228
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par SergioMaster Voir le message

    ce serait peut-être bien de mettre ce code en FAQ Delphi FMX
    Je vais regarder si je peux le mettre dans la FAQ.

    Citation Envoyé par SergioMaster Voir le message
    Toutefois, je remarque que ton code propose l'envoi d'un PDF et non d'un Zip comme dans le titre de la discussion donc, questionnement (bête) , ça fonctionne aussi pour un zip ?
    Oui ça fonctionne avec tout type de pièce jointe

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

Discussions similaires

  1. Envoi de mail avec 'mail' ne fonctionne pas
    Par flavio_dev dans le forum Linux
    Réponses: 1
    Dernier message: 01/09/2008, 15h22
  2. Réponses: 4
    Dernier message: 30/03/2007, 11h37
  3. [Mail] Probleme pour l'envoi de mails avec mime
    Par tof91 dans le forum Langage
    Réponses: 1
    Dernier message: 09/03/2006, 17h44
  4. envoi de mail avec sql server
    Par the_new dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/03/2005, 19h56
  5. envoi de mail avec attachement de fichier
    Par GMI3 dans le forum Modules
    Réponses: 2
    Dernier message: 24/09/2003, 12h22

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