目前,我有一个非常标准的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选项?谢谢!
答案 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>