Android - How do I detect if user has chosen to share to Facebook or twitter using intent?

微笑、不失礼 提交于 2020-01-09 10:04:41

问题


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, e.g. 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 e.g. 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.


回答1:


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();
}



回答2:


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);
}



回答3:


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



来源:https://stackoverflow.com/questions/23494624/android-how-do-i-detect-if-user-has-chosen-to-share-to-facebook-or-twitter-usi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!