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

问题描述 投票:0回答:3

使用我在另一篇文章中找到的代码,电子邮件似乎已准备好发送附件,但是当收到电子邮件时,没有附件。此外,电子邮件地址必须手动输入,它不是由 CreateEmail 语句填充的。我从 Gmail 帐户发送。有人帮忙吗?

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('[email protected]', 'Test Results', Memo1.Lines.text,'/sdcard/Download/Demo.pdf');
end;
android delphi android-intent firemonkey delphi-xe7
3个回答
3
投票

Intent.EXTRA_EMAIL
记录,需要字符串值的数组,但您要向其传递一个单个字符串。

您也没有正确使用

SharedActivity.getExternalFilesDir()
。它的
type
参数指定要查找的 文件夹类型(
MUSIC
PODCASTS
PICTURES
等),然后返回代表该
文件夹
JFile。 然后,您可以根据需要将 filename 附加到该文件夹的路径。 但是,在这种情况下,您的
Attachment
字符串包含您要附加的实际文件的完整路径,因此您根本不应该调用
getExternalFilesDir()
。 按原样从路径创建
JFile

试试这个:

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;

阅读这篇文章,了解有关在 Android 中发送电子邮件的更多详细信息:

在 Delphi XE5 Android 应用程序中启动活动并处理结果 |发送电子邮件


3
投票

这是多个附件的工作代码。 在 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;

0
投票

我用 Delphi 11 尝试了上面的例子,我得到“通过 ClipData.Item.getUri() 暴露在应用程序之外”

在选项下,我确实将“安全文件共享”设置为 true。

请帮忙。尝试了几周的时间来跟踪各种小组主题,但无法得到正确的结果。

© www.soinside.com 2019 - 2024. All rights reserved.