user3602803
user3602803

Reputation: 109

Sending Multiple Attachments firemonkey

I'm trying send a email with multiple attachments, but, in Android SDK most recent, was changed the method to send files, and most existing tutorials is about the older SDK version ...

I obtained send the email with only one attachment, but not with multiple...

I try using the same method of 1 attachment but using it twice. Not works, the delphi catch only the last Intent.putExtra.

What I'm making wrong ?

(Utilizing only the Android Plataform)

procedure TF_inicio.Rec_exportClick(Sender: TObject);
var
  sfilename: string;

  AttachmentFile1: JFile;
  AttachmentFile2: JFile;
  AttachmentFile3: JFile;

  Intent: JIntent;
  AddressesTo, Anexos: TJavaObjectArray<JString>;
  LList: TStringDynArray;
  I: Integer;
  LSearchOption: TSearchOption;
  // AddressesCC, AddressesBCC: TJavaObjectArray<JString>;
begin
  LSearchOption := TSearchOption.soTopDirectoryOnly;
  LList := TDirectory.GetFiles(path, '*.csv', LSearchOption);

  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SENDTO);
  Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('mailto:')));
  AddressesTo := TJavaObjectArray<JString>.Create(1); // Enviar para:
  AddressesTo.Items[0] := StringToJString('[email protected]');
  Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, AddressesTo);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT,
    StringToJString(F_inicio.placa_veiculo + ' - ' +
    FormatDateTime('dd/mm/yyyy hh:MM', NOW)));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT,
    StringToJString('Email automático' + sLineBreak + ''));

  if Length(LList) = 1 then
    AttachmentFile1 := TJFile.JavaClass.init(StringToJString(LList[1]));

  if Length(LList) = 2 then
    AttachmentFile2 := TJFile.JavaClass.init(StringToJString(LList[2]));

  if Length(LList) = 3 then
    AttachmentFile3 := TJFile.JavaClass.init(StringToJString(LList[3]));

  if Length(LList) >= 1 then
  begin
    AttachmentFile1 := TJFile.JavaClass.init(StringToJString(LList[1]));
    Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM,
      TJParcelable.Wrap((TJnet_Uri.JavaClass.fromFile(AttachmentFile1)
      as ILocalObject).GetObjectID));
  end;

  if Length(LList) >= 2 then
  begin
    AttachmentFile2 := TJFile.JavaClass.init(StringToJString(LList[2]));
    Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM,
      TJParcelable.Wrap((TJnet_Uri.JavaClass.fromFile(AttachmentFile2)
      as ILocalObject).GetObjectID));
  end;

  if Length(LList) >= 3 then
  begin
    AttachmentFile3 := TJFile.JavaClass.init(StringToJString(LList[3]));
    Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM,
      TJParcelable.Wrap((TJnet_Uri.JavaClass.fromFile(AttachmentFile3)
      as ILocalObject).GetObjectID));
  end;

  SharedActivity.startActivity(Intent);
end;

Upvotes: 0

Views: 905

Answers (1)

Remy Lebeau
Remy Lebeau

Reputation: 598449

Just use a simple loop to add the attachments, all those redundant if blocks are unnecessary:

procedure TF_inicio.Rec_exportClick(Sender: TObject);
var
  sfilename: string;
  AttachmentFile: JFile;
  Intent: JIntent;
  AddressesTo, Anexos: TJavaObjectArray<JString>;
  LList: TStringDynArray;
  I: Integer;
  LSearchOption: TSearchOption;
  // AddressesCC, AddressesBCC: TJavaObjectArray<JString>;
  LUri: Jnet_URI;
begin
  LSearchOption := TSearchOption.soTopDirectoryOnly;
  LList := TDirectory.GetFiles(path, '*.csv', LSearchOption);

  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SENDTO);
  Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('mailto:')));
  AddressesTo := TJavaObjectArray<JString>.Create(1); // Enviar para:
  AddressesTo.Items[0] := StringToJString('[email protected]');
  Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, AddressesTo);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT,
    StringToJString(F_inicio.placa_veiculo + ' - ' +
    FormatDateTime('dd/mm/yyyy hh:MM', NOW)));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT,
    StringToJString('Email automático' + sLineBreak + ''));

  for I := 0 to Length(LList)-1 do
  begin
    AttachmentFile := TJFile.JavaClass.init(StringToJString(LList[I]));
    LUri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
    Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((LUri as ILocalObject).GetObjectID));
  end;

  SharedActivity.startActivity(Intent);
end;

Or, use a single call to Intent.putExtra(Parsable[]) or Intent.putParcelableArrayListExtra() to add an array of URIs, instead of calling Intent.putExtra(Parsable) for each individual URI:

procedure TF_inicio.Rec_exportClick(Sender: TObject);
var
  LList: TStringDynArray;
  LSearchOption: TSearchOption;
  Intent: JIntent;
  I: Integer;
  AttachmentFile: JFile;
  LUri: Jnet_Uri;
  LURIs: TJavaObjectArray<JParcelable>;
begin
  LSearchOption := TSearchOption.soTopDirectoryOnly;
  LList := TDirectory.GetFiles(path, '*.csv', LSearchOption);

  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE);
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('mailto:')));
  Intent.setType(StringToJString('vnd.android.cursor.dir/email'));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, StringToJString('[email protected]'));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(F_inicio.placa_veiculo + ' - ' + FormatDateTime('dd/mm/yyyy hh:MM', NOW)));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('Email automático' + sLineBreak + ''));

  if LList <> nil then
  begin
    LURIs := TJavaObjectArray<JParcelable>.Create(Length(LList));
    for I := 0 to Length(LList)-1 do
    begin
      AttachmentFile := TJFile.JavaClass.init(StringToJString(LList[I]));
      LUri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
      LURIs[I] := TJParcelable.Wrap((LUri as ILocalObject).GetObjectID); 
    end;
    Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, LURIs);
  end;

  SharedActivity.startActivity(Intent);
end;
procedure TF_inicio.Rec_exportClick(Sender: TObject);
var
  LList: TStringDynArray;
  LSearchOption: TSearchOption;
  Intent: JIntent;
  I: Integer;
  AttachmentFile: JFile;
  LUri: Jnet_Uri;
  LURIs: JArrayList;
begin
  LSearchOption := TSearchOption.soTopDirectoryOnly;
  LList := TDirectory.GetFiles(path, '*.csv', LSearchOption);

  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE);
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
  Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('mailto:')));
  Intent.setType(StringToJString('vnd.android.cursor.dir/email'));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, StringToJString('[email protected]'));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(F_inicio.placa_veiculo + ' - ' + FormatDateTime('dd/mm/yyyy hh:MM', NOW)));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('Email automático' + sLineBreak + ''));

  if LList <> nil then
  begin
    LURIs := TJArrayList.Create;
    for I := 0 to Length(LList)-1 do
    begin
      AttachmentFile := TJFile.JavaClass.init(StringToJString(LList[I]));
      LUri := TJnet_Uri.JavaClass.fromFile(AttachmentFile);
      LURIs.add(LUri); 
    end;
    Intent.putParcelableArrayListExtra(TJIntent.JavaClass.EXTRA_STREAM, LURIs);
  end;

  SharedActivity.startActivity(Intent);
end;

Upvotes: 1

Related Questions