Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.917 Beiträge
 
Delphi 12 Athens
 
#1

SendMail unter Android mit XE8

  Alt 25. Aug 2015, 15:42
Hallo zusammen,

weil im Web viele falsche Lösungen für XE8 kursieren (meistens ältere unter XE5), wie z.B.:
http://blong.com/Articles/DelphiXE6A...#EmailActivity

PROBLEM
Code:
 uses
  Androidapi.JNIBridge, ...

...

procedure CreateEmail(const Recipient, Subject, Content: string); overload;
var
  Intent: JIntent;
begin
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND);
  Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, StringToJString(Recipient));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(Subject));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(Content));
  // Intent.setType(StringToJString('plain/text'));
  Intent.setType(StringToJString('message/rfc822'));
  // LaunchActivity(Intent);
  LaunchActivity(TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence('Which email app?')));
end;
habe ich hier mal einen funktionierenden Code unter XE8 gepostet:
http://stackoverflow.com/questions/1...ail-delphi-xe5

MEINE AKTUELLE LÖSUNG:
Code:
uses
    Androidapi.JNI.JavaTypes
  , Androidapi.JNIBridge
  , Androidapi.JNI.GraphicsContentViewText
  , AndroidApi.Helpers
  , FMX.Helpers.Android
  ;

...
procedure CreateEmail(const sRecp, sSubj, sBody : string);
var
  Intent: JIntent;
  aDest : TJavaObjectArray<JString>;
begin

    Intent := TJIntent.Create;

    aDest := TJavaObjectArray<JString>.Create(1);
    aDest.Items[0] := StringToJString( sRecp );

    Intent.setAction(TJIntent.JavaClass.ACTION_Send);
    Intent.setFlags( TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK);
    Intent.putExtra( TJIntent.JavaClass.EXTRA_EMAIL,  aDest );
    Intent.putExtra( TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString(sSubj));
    intent.putExtra( TJIntent.JavaClass.EXTRA_TEXT,   StringToJString(sBody));

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

    SharedActivity.startActivity(TJIntent.JavaClass.createChooser(Intent,
                                 StrToJCharSequence('Which email app ?')));

end;
Der entscheidende Unterschied ist:

1. Fall String wird übergeben --> email Adresse wird NICHT der EmailApp übergeben,
Zitat:
Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, StringToJString(Recipient));
2. Fall StringArray wird übergeben --> email Adresse wird KORREKT der EmailApp übergeben
Zitat:
Recipients := TJavaObjectArray<JString>.Create(1);
Recipients.Items[0] := StringToJString(Recipient);
Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, Recipients);

Dann gibt es aber noch verschiedene Philosophien welcher MIME Type der richtige ist:
Code:
 
Intent.setType(StringToJString('plain/text'));     // Alle möglichen Apps kommen im Chooser
Intent.setType(StringToJString('vnd.android.cursor.dir/email')); // Dise Option gibt es auch, läöuft aber auch nicht ideal
Intent.setType(StringToJString('message/rfc822')); // Dies ist die empfohlene Version, hier sollten nur Mailfähige Apps angezeigt werden
Aber egal was ich nehme, es kommen immer auch Nicht-MailApps im Chooser hoch, so wie TotalCommander.
Kann natürlich sein das sich alle diese Apps für Email registriert haben, aber vielleicht gibt es
ja noch Tricks und Optimierungen um das wirklich nur an echte Mail apps zu leiten.


Rollo
  Mit Zitat antworten Zitat