I've created an application which shares to facebook, twitter etc. But I want to perform different functions dependent on who the user is sharing to , for instance if the user is sharing to Facebook do one thing but if the user shares to twitter do another.
How do I do this?
My code so far is below:
private void ShareSub() {
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(
Intent.EXTRA_TEXT,
"You've just shared "
+ "Awesome");
startActivity(i);
}
Further explanation of above code:
When the user presses the " menu_item_share " button in the action bar, the function above is triggered. This function then makes a box like the image below appear, which allows the user to select a particular option, eg Facebook or twitter. The Intent.EXTRA_TEXT
is then shared to that particular app.
What I'm wanting is, when the user clicks for instance Facebook, a particular function is called eg Sharing via their (Facebook's) api etc.
I'm not using ShareActionProvider like below:
<item
android:id="@+id/your_share_item"
android:actionProviderClass="android.widget.ShareActionProvider"
android:showAsAction="ifRoom"
android:title="@string/share"/>
Instead, I've created a simple button which calls the function ShareSub :
<item
android:id="@+id/menu_item_share"
android:icon="@android:drawable/ic_menu_share"
android:showAsAction="ifRoom"
android:title="Share"/>
The reason I've chosen to do it this way is, I don't want the recently shared to button to appear, as in the image below. This is causing me problems when I attempt to use the code suggested below because I haven't used ShareActionProvider .
You can't directly find out which app was chosen, but you can display your own Chooser dialog.
Instead of calling startActivity(i)
, get a list of all activities (facebook, twitter etc) that are registered to handle your intent using queryIntentActivities() .
List<ResolveInfo> activities = getPackageManager().queryIntentActivities (i, 0);
Each ResolveInfo
is an app that can handle your intent. Now you can show an AlertDialog containing a list of labels or icons. When the user selects a label from the list, you can handle what do to on an app-specific basis in the click handler for the dialog.
EDIT : Here's a full working example
private void ShareSub() {
final Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT,"text");
final List<ResolveInfo> activities = getPackageManager().queryIntentActivities (i, 0);
List<String> appNames = new ArrayList<String>();
for (ResolveInfo info : activities) {
appNames.add(info.loadLabel(getPackageManager()).toString());
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Complete Action using...");
builder.setItems(appNames.toArray(new CharSequence[appNames.size()]), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
ResolveInfo info = activities.get(item);
if (info.activityInfo.packageName.equals("com.facebook.katana")) {
// Facebook was chosen
} else if (info.activityInfo.packageName.equals("com.twitter.android")) {
// Twitter was chosen
}
// start the selected activity
i.setPackage(info.activityInfo.packageName);
startActivity(i);
}
});
AlertDialog alert = builder.create();
alert.show();
}
Use presses a button in the action bar which triggers the above function.
If you used a ShareActionProvider
instead, you could detect when a user selects a particular app from the list by implementing a ShareActionProvider.OnShareTargetSelectedListener
. Otherwise you won't be able to detect which app is selected unless you implement your own activity chooser.
Here's an example:
menu
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/your_share_item"
android:actionProviderClass="android.widget.ShareActionProvider"
android:showAsAction="ifRoom"
android:title="@string/share"/>
</menu>
Implementation
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate your menu
getMenuInflater().inflate(R.menu.share, menu);
// The Intent you want to share
final Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT, "Test");
// Set up your ShareActionProvider
final ShareActionProvider shareActionProvider = (ShareActionProvider) menu.findItem(
R.id.your_share_item).getActionProvider();
shareActionProvider.setShareIntent(i);
shareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener() {
@Override
public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
final String packageName = intent.getComponent().getPackageName();
if (packageName.equals("com.facebook.katana")) {
// Do something for Facebook
} else if (packageName.equals("com.twitter.android")) {
// Do something for Twitter
}
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
Try that answers: here choose the define intent which you want:
Customize Android Intent.ACTION_SEND
Branching the Android Share Intent extras depending on which method they choose to share
Android - How to filter specific apps for ACTION_SEND intent
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.