2011-12-02 61 views
3

目前我有一个非常标准的ACTION_SEND意图从我的应用程序内共享信息。代码类似于下面的是:在Android上捕获和拦截ACTION_SEND意图

Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.setType("text/plain"); 
    intent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    intent.putExtra(Intent.EXTRA_TEXT, text); 
    context.startActivity(Intent.createChooser(intent, title)); 

现在,如果用户安装了手机上的Facebook应用程序,那么Facebook显示为为选择器意图的选项。但是,我想拦截用户点击“Facebook”并使用Facebook SDK执行任务,而不是已经在用户手机上的Facebook应用程序。有没有办法拦截Facebook的onClick选项?谢谢!

回答

7

这里是一个链接到我的博客文章与详细的解决方案,包括代码和屏幕截图。

http://clickclickclack.wordpress.com/2012/01/03/intercepting-androids-action_send-intents/

如从该文章援引:

[W]ë首先创建一个新ACTION_SEND意图和类型设置为文本 /纯。接下来,我们创建一个List。我们打电话给包 经理查询所有注册的action_send意图 的活动。此调用会退回ResolveInfo对象列表,每个对象都与设备上声明处理发送 操作的活动对应的 。

[随后,R]比粥启动ACTION_SEND意图,并让它 创建自己的对话框(一个我们会有无法控制),我们将 建立我们自己与AlertDialog.Builder。首先,我们给它一个 标题,然后将其适配器,我们只是 活动列表作为我们的数据集创建的列表适配器[。]

我们需要看看下一个重要的一块是的OnClick听众我们 给了Builder。要找到用户点击的项目,我们使用adapter.getItem(int which)方法。这将返回我们原始列表的 位置中的对象,在这种情况下,将返回对应于所选活动的ResolveInfo对象 。特别是我的情况,我 只关心把事情分成两组:Facebook而不是Facebook。要做到这一点,我只需检查所选活动的 包名是否包含'脸谱'。如果没有,我创建一个新的 action_send intent,将类名设置为选定的活动,然后 启动它。然而,如果包名称包含'脸谱',我 实例化我的个人PostToFacebookDialog对象,它将创建一个带有发布和取消按钮的基本Android对话框,并直接使用Graph API发布到 Facebook,从而规避用户的 安装Facebook应用程序。

+0

@亚历山大卢卡斯,你不能改变列表的功能。我鼓励你阅读我的文章,了解如何做到这一点。 badhairday,我的文章实现了您要求的确切功能并包含代码。如果您有任何疑问,请回过头看看我。 – italianmike

+0

+1 Thx帮了很大忙 – 66CLSjY

1

如果您在自己的应用程序中内置了一些功能以发布到Facebook,那么没有理由创建选择器并让用户首先选择外部应用程序。也就是说,如果您使用SDK并且在您自己的应用程序中内置了一些功能来执行此操作,那么请不要离开应用程序。只需创建一个意图火到一个特定的类,像这样:

Intent intent = new Intent(this.getActivity(), YourPostingActivity.class); 
...// Add stuff 
startActivity(intent); 

这不是真的有可能修改选择器中的链接至Facebook(更不用提,用户体验较差拦截他们的企图来处理与他们选择的应用程序行动)。也就是说,如果您在自己的应用中注册相关活动作为ACTION_SEND意图的接收者,它将显示在列表中,用户将可以选择您的应用而不是原生Facebook应用。

+0

但是如果我想保留通过彩信,电子邮件和用户在手机上安装的任何其他东西的能力。 – mhenry

+0

答案更新:) –

+0

注册我自己的应用程序作为ACTION_SEND意图的接收方的问题是官方的Facebook应用程序仍然会在列表中显示。我不希望发生这种情况。 – mhenry