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

时间:2014-05-06 12:22:47

标签: java android facebook android-intent 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

4 个答案:

答案 0 :(得分:19)

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

不要致电startActivity(i),而是使用queryIntentActivities()获取已注册处理您意图的所有活动(Facebook,Twitter等)列表。

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

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

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

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

答案 1 :(得分:7)

  

使用按操作栏中的按钮可触发上述功能。

如果您使用了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);
}

答案 2 :(得分:1)

虽然这个问题有一个公认的答案,但事情已经发生了变化,现在有一个更好的方法,这是实现这一目标的推荐方法。

使用“Android 共享表”

文档如下: https://developer.android.com/training/sharing/send#share-interaction-data

在创建 IntentChooser 时,您可以传递一个待处理的意图,这将在您的应用内触发一个广播接收器。

该广播接收器的 onReceive 方法提供的数据将为您提供用于处理 SEND 意图的组件的名称。

用于向 SEND 意图添加待处理意图的代码:

Intent share = new Intent(ACTION_SEND);
...
PendingIntent pi = PendingIntent.getBroadcast(myContext, requestCode,
        new Intent(myContext, MyBroadcastReceiver.class),
        PendingIntent.FLAG_UPDATE_CURRENT);
share = Intent.createChooser(share, null, pi.getIntentSender());

用于检索用户选择的组件的详细信息的代码:

@Override public void onReceive(Context context, Intent intent) {
  ...
  ComponentName clickedComponent = intent.getParcelableExtra(EXTRA_CHOSEN_COMPONENT);
}

答案 3 :(得分:0)