Android - 如何检测用户是否选择使用意图分享到Facebook或Twitter?

我创建了一个应用程序,可以分享到Facebook,Twitter等。但我想根据用户分享给谁来执行不同的功能,例如,如果用户向Facebook分享做一件事,但如果用户分享到Twitter做另一件事。

我该怎么做?

到目前为止,我的代码如下:

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

以上代码的进一步说明:

当用户按下操作栏中的“menu_item_share”按钮时,将触发上述功能。然后,此功能使如下图所示的框出现,该框允许用户选择特定选项,例如Facebook或twitter。然后,将 共享到该特定应用。Intent.EXTRA_TEXT

我想要的是,当用户点击例如Facebook时,一个特定的功能被称为,例如通过他们(Facebook的)api等进行共享。

enter image description here

我没有使用ShareActionProvider,如下所示:

   <item
        android:id="@+id/your_share_item"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom"
        android:title="@string/share"/>

相反,我创建了一个简单的按钮,它调用了函数ShareSub

<item
    android:id="@+id/menu_item_share"
    android:icon="@android:drawable/ic_menu_share"
    android:showAsAction="ifRoom"
    android:title="Share"/>

我选择这样做的原因是,我不希望出现最近共享到的按钮,如下图所示。当我尝试使用下面建议的代码时,这会导致我出现问题,因为我没有使用ShareActionProvider

enter image description here


答案 1

您无法直接找出选择了哪个应用,但可以显示自己的“选择器”对话框。

而不是调用 ,获取所有活动(facebook,twitter等)的列表,这些活动已注册以使用queryIntentActivities()处理您的意图。startActivity(i)

List<ResolveInfo> activities = getPackageManager().queryIntentActivities (i, 0);

每个都是可以处理您的意图的应用程序。现在,您可以显示包含标签或图标列表的 AlertDialog。当用户从列表中选择标签时,你可以在对话框的单击处理程序中处理特定于应用执行的操作。ResolveInfo

编辑:这是一个完整的工作示例

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 按下操作栏中的按钮,该按钮将触发上述功能。

如果您改用 ShareActionProvider,则可以通过实现 ShareActionProvider.OnShareTargetSelectedListener 来检测用户何时从列表中选择特定应用。否则,除非您实现自己的活动选择器,否则您将无法检测到选择了哪个应用。

下面是一个示例:

菜单

<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>

实现

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