Theo hiểu biết của tôi, StackOverflow có rất nhiều người hỏi câu hỏi này theo nhiều cách khác nhau, nhưng chưa có ai trả lời hoàn toàn.
Thông số kỹ thuật của tôi kêu gọi người dùng có thể chọn email, twitter, facebook hoặc SMS, với văn bản tùy chỉnh cho từng người. Đây là cách tôi hoàn thành nó:
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);
}
Tôi đã tìm thấy những cách để làm điều này ở nhiều nơi, nhưng tôi chưa thấy tất cả ở một nơi khác.
Lưu ý rằng phương pháp này cũng ẩn tất cả các tùy chọn ngớ ngẩn mà tôi không muốn, như chia sẻ qua wifi và bluetooth.
Hy vọng điều này sẽ giúp được ai đó.
Chỉnh sửa:
Trong một bình luận, tôi được yêu cầu giải thích mã này đang làm gì. Về cơ bản, nó tạo ra một ACTION_SEND
ý định cho CHỈ khách hàng email gốc, sau đó xử lý các ý định khác đối với người chọn. Làm cho mục đích ban đầu cụ thể của email được loại bỏ tất cả các rác bổ sung như wifi và bluetooth, sau đó tôi lấy các ý định khác mà tôi muốn từ một ACTION_SEND
loại văn bản đơn giản và xử lý chúng trước khi hiển thị trình chọn.
Khi tôi lấy các ý định bổ sung, tôi đặt văn bản tùy chỉnh cho từng mục.
Edit2: Đã được một lúc kể từ khi tôi đăng bài này, và mọi thứ đã thay đổi một chút. Nếu bạn đang thấy gmail hai lần trong danh sách các tùy chọn, hãy thử xóa xử lý đặc biệt cho "android.gm" như được đề xuất trong một nhận xét của @h_k bên dưới.
Vì câu trả lời này là nguồn gốc của gần như tất cả các điểm danh tiếng stackoverflow của tôi, nên ít nhất tôi phải cố gắng cập nhật nó.