내 지식으로는 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 및 블루투스를 통한 공유와 같이 원하지 않는 모든 바보 같은 옵션도 숨 깁니다.
이것이 누군가를 돕기를 바랍니다.
편집 :
의견 에서이 코드의 기능을 설명하라는 요청을 받았습니다. 기본적으로 ACTION_SEND
기본 이메일 클라이언트 전용 인 텐트를 만든 다음 다른 인 텐트를 선택자에게 전달합니다. 원래의 인 텐트 전자 우편을 특정하게 만들면 wifi 및 블루투스와 같은 추가 쓰레기를 모두 제거한 다음 ACTION_SEND
일반 텍스트 유형의 일반 텍스트 에서 원하는 다른 인 텐트를 가져 와서 선택자를 표시하기 전에이를 고정시킵니다.
추가 의도를 파악할 때 각 사용자 정의 텍스트를 설정합니다.
편집 2 : 이 게시물을 게시 한지 오래 되었지만 상황이 약간 변경되었습니다. 옵션 목록에 gmail이 두 번 표시되면 아래 @h_k의 설명에 제안 된대로 "android.gm"에 대한 특수 처리를 제거하십시오.
이 답변은 거의 모든 스택 오버 플로우 평판 포인트의 원천이므로 적어도 최신 상태로 유지해야합니다.