在Android上捕获和拦截ACTION_SEND意图

时间:2011-12-02 01:00:48

标签: java android android-intent

目前,我有一个非常标准的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应用程序。有没有办法拦截onClick的Facebook选项?谢谢!

2 个答案:

答案 0 :(得分:7)

这是我的博客文章的链接,其中包含详细的解决方案,包括代码和屏幕截图。

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

引自那篇文章:

  

[W]首先创建一个新的action_send意图并将类型设置为   text / plain的。接下来,我们创建一个List。我们打电话给包裹   管理器使用action_send intent查询所有活动   注册。此调用会重新调整ResolveInfo对象的列表   对应于声称处理发送的设备上的活动   动作。

     

[然后,r] ather而不是启动action_send意图并让它   我们创建了自己的对话框(我们无法控制的对话框)   将使用AlertDialog.Builder构建我们自己的。首先我们给它一个   title,然后将其适配器设置为我们刚创建的列表适配器   活动列表作为我们的数据集[。]

     

我们需要关注的下一个重要部分是OnClick监听器   给了建造者。要查找用户点击的项目,我们使用   adapter.getItem(int which)方法。这将返回该对象   我们的原始列表的位置,在本例中是ResolveInfo对象   对应于所选的活动。特别是我的情况,我   只关心将事物分成两组:Facebook而不是   Facebook的。要做到这一点,我只需检查所选的活动是否正确   包名称包含'facebook'。如果没有,我创建一个新的   action_send intent,将类名设置为所选活动,以及   发动它。但是,如果包名称包含'facebook',我   实例化我将创建的个人PostToFacebookDialog对象   带有发布和取消按钮的基本Android对话框,并将发布到   Facebook直接使用Graph API,从而绕过了用户的角​​色   安装了Facebook应用程序。

答案 1 :(得分:1)

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

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

在选择器中修改指向Facebook的链接是不可能的(更不用说,用来拦截他们尝试用他们选择的应用程序处理动作的糟糕用户体验)。也就是说,如果您在自己的应用中注册相关活动作为ACTION_SEND意图的接收者,它将显示在列表中,用户可以选择您的应用而不是本机Facebook应用。< / p>