从Intent.createChooser获取选择的应用程序

时间:2014-07-03 19:26:00

标签: java android android-intent selection getselection

我正在尝试捕获Intent.createChooser的结果,以了解用户选择共享的应用。

我知道有很多与此相关的帖子:

但是这些帖子有些陈旧,我希望可能会有一些新的发展。

我正在尝试实现share action,而不会出现在菜单中。我想要的最接近的解决方案由ClickClickClack提供,他建议实施自定义应用选择器,但这似乎很重要。此外,似乎可能会有一些Android挂钩来获取所选的应用,例如ActivityChooserModel.OnChooseActivityListener

我的MainActivity中有以下代码,但onShareTargetSelected方法永远不会被调用。

    Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_TEXT, shareMessage());
    sendIntent.setType("text/plain");

    Intent intent = Intent.createChooser(sendIntent, getResources().getText(R.string.share_prompt));

    ShareActionProvider sap = new ShareActionProvider(this);
    sap.setShareIntent(sendIntent);
    sap.setOnShareTargetSelectedListener(new ShareActionProvider.OnShareTargetSelectedListener() {
        @Override
        public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
            System.out.println("Success!!");
            return false;
        }
    });

    startActivityForResult(intent, 1);

2 个答案:

答案 0 :(得分:14)

从API级别22开始,现在实际上是可行的。在Android 5.1中,添加了一种方法(createChooser (Intent target, CharSequence title, IntentSender sender)),允许接收用户选择的结果。当您向IntentSender提供createChooser时,选择者对话框会通过用户选择的ComponentName通知发件人。它将在EXTRA_CHOSEN_COMPONENT IntentSender的额外名为notified的字段中提供。

答案 1 :(得分:2)

  

我正在尝试捕获Intent.createChooser的结果,以了解用户选择共享的应用程序。

这是不可能的。

其他“选择”解决方案,如ShareActionProvider,可能会提供更多。我没有检查Intent递交给onShareTargetSelected()以查看它是否包含所选目标的ComponentName,尽管文档表明它应该。

并且,如果由于某种原因它没有,欢迎您尝试分叉ShareActionProvider来添加您想要的钩子。

createChooser()无法以这种方式处理的原因仅仅是因为“选择”是通过与您分开的流程完成的。

  

我的MainActivity中有以下代码,但onShareTargetSelected方法永远不会被调用。

ShareActionProvider进入操作栏。你不能只创建一个实例,调用几个setter,并期望发生一些事情。