简体   繁体   English

如何使用默认的Android电子邮件应用程序发送带有附件的电子邮件-Delphi XE7

[英]How to send email with attachment using default Android email app - Delphi XE7

Using code below which I found on another post , the email appears ready to send with the attachment, but when email is received, there is no attachment. 使用下面在另一篇文章中找到的代码,该电子邮件似乎可以随附件一起发送,但是当收到电子邮件时,没有附件。 Also, the email address has to be manually entered, it is not populated by the CreateEmail statement. 另外,必须手动输入电子邮件地址,CreateEmail语句不会填充该电子邮件地址。 I am sending from a gmail account. 我是从Gmail帐户发送的。 Anyone help please? 有人帮忙吗?

procedure TForm1.CreateEmail(const Recipient, Subject, Content,
 Attachment: string);
var
 Intent: JIntent;
 Uri: Jnet_Uri;
 AttachmentFile: JFile;
begin
 Intent := TJIntent.Create;
 Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
 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);

 Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM,
   TJParcelable.Wrap((Uri as ILocalObject).GetObjectID));

 Intent.setType(StringToJString('vnd.android.cursor.dir/email'));

 SharedActivity.startActivity(Intent);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 CreateEmail('xxx@shaw.ca', 'Test Results', Memo1.Lines.text,'/sdcard/Download/Demo.pdf');
end;

Intent.EXTRA_EMAIL is documented as expecting an array of string values, but you are passing it a single string instead. Intent.EXTRA_EMAIL记录为期望字符串值的数组 ,但是您将其传递为单个字符串。

You are also not using SharedActivity.getExternalFilesDir() correctly. 您也没有正确使用SharedActivity.getExternalFilesDir() Its type parameter specifies the type of folder you want to lookup ( MUSIC , PODCASTS , PICTURES , etc), and then it returns a JFile that represents that folder . type参数指定要查找的文件夹类型MUSICPODCASTSPICTURES等),然后返回代表该文件夹JFile You can then append a filename to the path of that folder as needed. 然后,您可以根据需要将文件名附加到该文件夹​​的路径。 However, in this case, your Attachment string contains a full path to the actual file that you want to attach, so you should not be calling getExternalFilesDir() at all. 但是,在这种情况下, Attachment字符串包含您要附加​​的实际文件的完整路径,因此您根本不应调用getExternalFilesDir() Create a JFile from the path as-is instead. JFileJFile创建路径的JFile

Try this: 尝试这个:

procedure TForm1.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;

Read this article for more details about sending emails in Android: 阅读本文,了解有关在Android中发送电子邮件的更多详细信息:

Launching activities and handling results in Delphi XE5 Android apps | 在Delphi XE5 Android应用程序中启动活动和处理结果| Sending an email 发送邮件

Here is working code for multiple attachments. 这是多个附件的工作代码。 Works in 10.1 Berlin. 在柏林10.1工作。

procedure TForm1.ItemShare;
var
  chooserIntent, Intent: JIntent;
  Uri: Jnet_Uri;
  Uris: JArrayList;
  AttachmentFile: JFile;
begin
  {$IFDEF ANDROID}
    intent := TJIntent.Create;    
    intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE);
    intent.setType(StringToJString('text/*'));
    intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString('Email header'));

    Uris:= TJArrayList.Create;
    while i<condition
    begin
      AttachmentFile := TJFile.JavaClass.init(StringToJString('filename'));
      Uri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
      Uris.add(i,Uri);
      inc(i);
    end;   

    Intent.putParcelableArrayListExtra(TJIntent.JavaClass.EXTRA_STREAM, Uris);    
    Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('body'));   
    chooserIntent := TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence('Share using'));
    TAndroidHelper.Activity.startActivityForResult(chooserIntent, 0);
  {$ENDIF}
end;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM