Sepengetahuan saya, StackOverflow memiliki banyak orang yang mengajukan pertanyaan ini dengan berbagai cara, tetapi belum ada yang menjawab sepenuhnya.
Spek saya meminta pengguna untuk dapat memilih email, twitter, facebook, atau SMS, dengan teks khusus untuk masing-masing. Inilah cara saya mencapai hal itu:
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);
}
Saya menemukan sedikit cara melakukan ini di berbagai tempat, tetapi saya belum melihat semuanya di satu tempat di tempat lain.
Perhatikan bahwa metode ini juga menyembunyikan semua opsi konyol yang tidak saya inginkan, seperti berbagi melalui wifi dan bluetooth.
Semoga ini bisa membantu seseorang.
Sunting:
Dalam komentar, saya diminta menjelaskan apa yang dilakukan kode ini. Pada dasarnya, ini ACTION_SEND
HANYA menciptakan niat untuk klien email asli, lalu menempelkan maksud lain ke pemilih. Menjadikan email asli maksud khusus menghilangkan semua sampah tambahan seperti wifi dan bluetooth, lalu saya ambil maksud lain yang saya inginkan dari generik ACTION_SEND
tipe teks biasa, dan menempelkannya sebelum menunjukkan pemilih.
Ketika saya mengambil maksud tambahan, saya mengatur teks khusus untuk masing-masing.
Sunting2: Sudah beberapa saat sejak saya memposting ini, dan banyak hal telah berubah sedikit. Jika Anda melihat gmail dua kali dalam daftar opsi, coba hapus penanganan khusus untuk "android.gm" seperti yang disarankan dalam komentar oleh @h_k di bawah ini.
Karena jawaban yang satu ini adalah sumber dari hampir semua poin reputasi stackoverflow saya, saya harus setidaknya mencoba untuk tetap up to date.