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

13 java twitter android facebook android-intent

我创建了一个分享到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);
}
Run Code Online (Sandbox Code Playgroud)

以上代码的进一步说明:

当用户按下操作栏中的" menu_item_share "按钮时,触发上述功能.然后,此功能会显示如下图所示的框,允许用户选择特定选项,例如Facebook或Twitter.Intent.EXTRA_TEXT然后将该内容共享给该特定应用.

我想要的是,当用户点击例如Facebook时,会调用特定的功能,例如通过他们的(Facebook的)api等进行共享.

在此输入图像描述

我没有像下面这样使用 ShareActionProvider:

   <item
        android:id="@+id/your_share_item"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom"
        android:title="@string/share"/>
Run Code Online (Sandbox Code Playgroud)

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

<item
    android:id="@+id/menu_item_share"
    android:icon="@android:drawable/ic_menu_share"
    android:showAsAction="ifRoom"
    android:title="Share"/>
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

Nac*_*chi 19

您无法直接找到所选的应用程序,但您可以显示自己的"选配器"对话框.

而不是打电话startActivity(i),获取所有活动(Facebook,推特等)的列表,使用queryIntentActivities()注册处理您的意图.

List<ResolveInfo> activities = getPackageManager().queryIntentActivities (i, 0);
Run Code Online (Sandbox Code Playgroud)

每个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();
}
Run Code Online (Sandbox Code Playgroud)

  • 注意:我们无法确定共享是否成功或被用户取消。 (3认同)
  • 这是一个仅使用应用程序名称的基本示例。使用 [ResolveInfo.loadIcon](http://developer.android.com/reference/android/content/pm/ResolveInfo.html#loadIcon(android.content.pm.PackageManager)) 将可绘制图标添加到列表中。 (2认同)

adn*_*eal 7

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

如果您使用了ShareActionProvider替代,则可以通过实现a来检测用户何时从列表中选择特定应用程序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>
Run Code Online (Sandbox Code Playgroud)

履行

@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);
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

9671 次

最近记录:

10 年,7 月 前