Bildiğim kadarıyla, StackOverflow'un bu soruyu çeşitli şekillerde soran birçok insanı var, ancak henüz kimse tam olarak cevaplamadı.
Spesifikasyonum kullanıcının her biri için özel metin içeren e-posta, twitter, facebook veya SMS seçebilmesini istedi. İşte bunu nasıl başardım:
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);
}
Bunu çeşitli yerlerde nasıl yapacağımla ilgili bitler buldum, ancak hepsini başka bir yerde görmedim.
Bu yöntemin, wifi ve bluetooth üzerinden paylaşmak gibi istemediğim tüm aptalca seçenekleri de gizlediğini unutmayın.
Umarım bu birine yardımcı olur.
Düzenleme:
Bir yorumda, bu kodun ne yaptığını açıklamak istendi. Temel olarak, ACTION_SEND
YALNIZCA yerel e-posta istemcisi için bir amaç yaratır ve daha sonra seçiciye diğer hedefleri tarar. Orijinal niyet e-postasına özgü yapmak, wifi ve bluetooth gibi tüm gereksiz önemsiz şeylerden kurtulur, daha sonra ACTION_SEND
düz metin türünün genel birinden istediğim diğer niyetleri alır ve seçiciyi göstermeden önce bunları takarım.
Ek amaçları aldığımda, her biri için özel metin ayarladım.
Edit2: Bunu yayınladığımdan beri bir süre oldu ve işler biraz değişti. Seçenekler listesinde iki kez gmail görüyorsanız, aşağıdaki @h_k tarafından bir yorumda önerildiği gibi "android.gm" için özel işlemeyi kaldırmayı deneyin.
Bu cevap neredeyse tüm stackoverflow itibar puanlarımın kaynağı olduğundan, en azından güncel tutmaya çalışmalıyım.