Created
March 31, 2015 07:27
-
-
Save rafayali/8c9c0563782464427e55 to your computer and use it in GitHub Desktop.
Creating a chooser with custom intent resolvers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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")) { | |
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); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment