Meines Wissens hat StackOverflow viele Leute, die diese Frage auf verschiedene Weise stellen, aber noch hat niemand sie vollständig beantwortet.
Meine Spezifikation sah vor, dass der Benutzer E-Mail, Twitter, Facebook oder SMS mit benutzerdefiniertem Text für jeden auswählen kann. So habe ich das erreicht:
public void onShareClick(View v) {
Resources resources = getResources();
Intent emailIntent = new Intent();
emailIntent.setAction(Intent.ACTION_SEND);
// Native email client doesn't currently support HTML, but it doesn't hurt to try in case they fix it
emailIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(resources.getString(R.string.share_email_native)));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.share_email_subject));
emailIntent.setType("message/rfc822");
PackageManager pm = getPackageManager();
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
Intent openInChooser = Intent.createChooser(emailIntent, resources.getString(R.string.share_chooser_text));
List<ResolveInfo> resInfo = pm.queryIntentActivities(sendIntent, 0);
List<LabeledIntent> intentList = new ArrayList<LabeledIntent>();
for (int i = 0; i < resInfo.size(); i++) {
// Extract the label, append it, and repackage it in a LabeledIntent
ResolveInfo ri = resInfo.get(i);
String packageName = ri.activityInfo.packageName;
if(packageName.contains("android.email")) {
emailIntent.setPackage(packageName);
} else if(packageName.contains("twitter") || packageName.contains("facebook") || packageName.contains("mms") || packageName.contains("android.gm")) {
Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");
if(packageName.contains("twitter")) {
intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_twitter));
} else if(packageName.contains("facebook")) {
// Warning: Facebook IGNORES our text. They say "These fields are intended for users to express themselves. Pre-filling these fields erodes the authenticity of the user voice."
// One workaround is to use the Facebook SDK to post, but that doesn't allow the user to choose how they want to share. We can also make a custom landing page, and the link
// will show the <meta content ="..."> text from that page with our link in Facebook.
intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_facebook));
} else if(packageName.contains("mms")) {
intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_sms));
} else if(packageName.contains("android.gm")) { // If Gmail shows up twice, try removing this else-if clause and the reference to "android.gm" above
intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(resources.getString(R.string.share_email_gmail)));
intent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.share_email_subject));
intent.setType("message/rfc822");
}
intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
}
}
// convert intentList to array
LabeledIntent[] extraIntents = intentList.toArray( new LabeledIntent[ intentList.size() ]);
openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
startActivity(openInChooser);
}
Ich habe an verschiedenen Orten einiges dazu gefunden, aber ich habe nirgendwo anders alles an einem Ort gesehen.
Beachten Sie, dass diese Methode auch alle albernen Optionen verbirgt, die ich nicht möchte, wie z. B. das Teilen über WLAN und Bluetooth.
Hoffe das hilft jemandem.
Bearbeiten:
In einem Kommentar wurde ich gebeten zu erklären, was dieser Code tut. Grundsätzlich wird ACTION_SEND
NUR eine Absicht für den nativen E-Mail-Client erstellt und dann andere Absichten in die Auswahl übernommen. Wenn Sie die ursprüngliche Absicht per E-Mail festlegen, wird all der zusätzliche Müll wie WLAN und Bluetooth beseitigt. Dann greife ich zu den anderen Absichten, die ich möchte, aus einem generischen ACTION_SEND
Klartext und gehe sie an, bevor ich die Auswahl zeige.
Wenn ich die zusätzlichen Absichten ergreife, lege ich für jede einen benutzerdefinierten Text fest.
Edit2: Es ist eine Weile her, seit ich das gepostet habe, und die Dinge haben sich ein bisschen geändert. Wenn Sie Google Mail zweimal in der Liste der Optionen sehen, entfernen Sie die spezielle Behandlung für "android.gm", wie in einem Kommentar von @h_k unten vorgeschlagen.
Da diese eine Antwort die Quelle fast aller meiner Stackoverflow-Reputationspunkte ist, muss ich zumindest versuchen, sie auf dem neuesten Stand zu halten.