Наскільки мені відомо, у StackOverflow багато людей задають це питання різними способами, але ніхто ще не відповів на нього повністю.
Моя специфікація вимагала, щоб користувач міг вибрати електронну пошту, щебетати, фейсбук чи SMS, із спеціальним текстом для кожного. Ось як я це досяг:
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);
}
Я знайшов шматочки того, як це зробити в різних місцях, але я ще не бачив цього в одному місці.
Зауважте, що цей метод також приховує всі нерозумні варіанти, які я не хочу, як, наприклад, обмін по Wi-Fi та Bluetooth.
Сподіваюся, що це комусь допоможе.
Редагувати:
У коментарі мене попросили пояснити, що робить цей код. В основному, це створення ACTION_SEND
наміру ТІЛЬКИ для нативного клієнта електронної пошти, а потім приєднання інших намірів до вибору. Здійснюючи оригінальний електронний намір, що стосується електронної пошти, позбавляється від усіх зайвих сміттів, таких як wifi та bluetooth, тоді я захоплюю інші потрібні наміри із загального ACTION_SEND
типу простого тексту та виконую їх дії, перш ніж показувати вибір.
Коли я захоплюю додаткові наміри, я встановлюю персональний текст для кожного.
Edit2: З моменту публікації цього часу минуло деякий час, і все дещо змінилося. Якщо ви переглядаєте gmail двічі у списку параметрів, спробуйте видалити спеціальну обробку для "android.gm", як це запропоновано в коментарі @h_k нижче.
Оскільки ця одна відповідь є джерелом майже всіх моїх репутаційних ставок, я повинен принаймні намагатися її оновлювати.