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