通过ACTION_SEND在安卓应用中分享文本到Facebook

92

我有一个Android应用程序,它支持通过其他应用程序发送文本消息。因此,它使用ACTION_SEND意图和EXTRA_TEXT字段。选择器向我展示可以处理此类意图的所有应用程序,包括Twitter、电子邮件等,以及Facebook。但是,当我选择Facebook时,它会打开浏览器并转到以下页面:

http://m.facebook.com/sharer.php?u=mytext

它显示我的文本和提交按钮。但是,当我按下提交按钮时,什么也不会发生。页面只是重新加载。 我认为可能只能通过Facebook应用程序发送URL。可能吗?

是否有人成功通过Facebook Android应用程序通过ACTION_SEND发送文本?


4
如果您访问这篇Stack Overflow帖子并且对Facebook应用程序未能正确支持ACTION_SEND感到沮丧,请花些时间将您的帖子添加到以下话题中: http://forum.developers.facebook.net/viewtopic.php?id=93900 - Error 454
7
我猜2021年3月21日的问题还没有解决?因为我无法让它正常工作。 - Diego
1
看起来 Facebook 设计团队已经关闭了这个问题,因为预填写消息违反了他们的政策 :( - Brett
1
@Brett 这太荒唐了。他们只是想让你把他们的SDK添加到你的项目中。 - theblang
2
2015年5月17日 - 仍然无法与Facebook配合工作。 - Faisal Asif
显示剩余5条评论
10个回答

51
使分享功能在 Facebook 应用中可用,你只需要提供至少一个链接即可:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "Wonderful search engine http://www.google.fr/");
startActivity(Intent.createChooser(intent, "Share with"));

这将显示正确的分享窗口,但当您点击分享时,什么也不会发生(我还尝试了官方Twitter应用程序,它也无法工作)。

我发现使Facebook应用程序的分享工作的唯一方法是仅共享一个没有文本的链接:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "http://www.google.fr/");
startActivity(Intent.createChooser(intent, "Share with"));

它将显示以下窗口,而分享按钮将工作:

facebook share

显然它会自动从链接中获取图片和文本来填充分享内容。

如果你只想分享文本,你需要使用Facebook的API:https://github.com/facebook/facebook-android-sdk


4
“Wonderful search engine” 文本在哪里?这与人们在上面报告的同一个错误吗? - Kyle Clegg
3
他的意思是你只能发布一个链接,不能有文字。为了让它起作用,必须删除“Wonderful search engine”文本。 - chubbsondubs
如果您更新答案,我会点赞。目前,“Facebook”应用程序将从类似“Wonderful search engine http://www.google.fr/”的字符串中正确提取链接。请注意,我说的是**提取链接**,它仍然不会对文本执行任何操作。此外,“Twitter”可以同时使用文本和链接。 - theblang

46

06/2013:

  • 这是 Facebook 的一个 bug,不是你的代码问题。
  • Facebook 不会修复这个 bug,他们说 这是“设计缺陷”,他们破坏了 Android 的共享系统:https://developers.facebook.com/bugs/332619626816423
  • 使用 SDK 或仅分享 URL。
  • 提示:你可以通过将网页标题作为帖子的文本来有些欺骗。

29
非常感谢Facebook。 </讽刺> - mr_lou
感谢 @Loda 的提醒。 - Jigar

29

首先,您需要查询意图以处理共享选项。然后使用包名称过滤意图,然后我们将只有一个处理共享选项的意图!

通过Facebook分享

Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Content to share");
PackageManager pm = v.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
for (final ResolveInfo app : activityList) {
    if ((app.activityInfo.name).contains("facebook")) {
        final ActivityInfo activity = app.activityInfo;
        final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |             Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        shareIntent.setComponent(name);
        v.getContext().startActivity(shareIntent);
        break;
   }
}
奖励 - 通过Twitter分享
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Content to share");
PackageManager pm = v.getContext().getPackageManager();
List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
for (final ResolveInfo app : activityList) {
    if ("com.twitter.android.PostActivity".equals(app.activityInfo.name)) {
        final ActivityInfo activity = app.activityInfo;
        final ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        shareIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |             Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        shareIntent.setComponent(name);
        v.getContext().startActivity(shareIntent);
        break;
   }
}

如果您想通过其他共享应用程序分享,请在此处查找Tép Blog - 高级分享通过Android


14
在Facebook和Twitter上,如果您想使用仍无法共享文本的方式,您需要使用Android的SDK Facebook(Twitter)。请确保不改变原始意思并使内容更加通俗易懂。 - secretlm
你好,我尝试了这个,但它没有显示我想要在Facebook上分享的消息...不知道为什么?它要求我登录并显示“你在想什么?”提示文本而不是我想要分享的实际文本。 - Ramesh Sangili
这不起作用。它显示与正常对话意图相同的空输入。 - User
3
但在 Twitter 上,文本可以轻松发布。 - Trikaldarshiii
1
不适用于Facebook,而要在Twitter上启用分享,则无需设置意图组件。 - Juozas Kontvainis

11

所以我有一个变通方法,但它假设您对您要分享的页面具有控制权...

如果您按以下方式格式化您的EXTRA_TEXT...

String myText = "Hey!\nThis is a neat pic!";
String extraText = "http://www.example.com/myPicPage.html?extraText=\n\n" + myText;

如果您在非Facebook应用程序上查看,您的文本应该类似于以下内容:

http://www.example.com/myPicPage.html?extraText=

嗨!
这是一张不错的图片!

现在,如果您更新您的网站,使带有extraText查询参数的请求返回页面元数据中extraText的内容。

<!-- Make sure to sanitize your inputs! e.g. http://xkcd.com/327/ -->
<meta name="title" content="Hey! this is a neat pic!">

那么当Facebook检索该网址以生成对话框时,它将读取标题元数据并将其嵌入您的分享对话框中。

我知道这是一个相当令人不爽的解决方案,所以请带着一点怀疑的态度看待它。


(加一)是指xkcd漫画中的一个梗。 - Aamir Abro

11

编辑后:随着官方Facebook Android应用程序的最新版本发布(2011年7月14日),它可以正常工作了!

旧内容:如果用户选择使用Facebook应用程序进行分享,则上述示例无法正常工作,但如果用户选择Seesmic应用程序来发布到Facebook,则可以正常工作。我猜想Seesmic比Facebook拥有更好的Facebook API实现!


在 Facebook 版本 1.6.1 中,它无法正常工作,并且在发送时似乎存在一些其他错误! - sat
它开始工作了!不知道问题出在哪里。谢谢,它也适用于FB v 1.6.1。 - sat
9
自从 Facebook 应用程序版本 1.6.2 发布以来,此答案已不正确:http://developers.facebook.com/bugs/363863587019268 - alaeri

2
看起来Facebook应用程序对此意图的处理不正确。最可靠的方法似乎是使用Facebook Android API。
SDK位于此链接:http://github.com/facebook/facebook-android-sdk 在“用法”下,有如下内容:
显示一个Facebook对话框。 SDK支持多个WebView html对话框,用于用户交互,例如创建墙帖。这旨在提供快速的Facebook功能,而无需实现本机Android UI并直接通过API将数据传递给Facebook。
这似乎是最好的方法 - 显示将发布到墙上的对话框。唯一的问题是他们可能需要先登录。

那不是我想要的,但无论如何感谢你的提示。我需要添加一个单独的菜单项来实现Facebook分享... - Goddchen
是的,我明白你的意思了,这真是个麻烦事,我的应用程序也遇到了ACTION_SEND意图的同样问题,而且Facebook也没有修复他们的应用程序,因此这似乎是最好的替代方案。 - HXCaine
3
我刚刚又做了一些搜索,发现全网都有人遇到这个问题,而Facebook并没有提供任何帮助。 http://forum.developers.facebook.net/viewtopic.php?pid=255227 - HXCaine

1
Check this out : By this we can check activity results also....
// Open all sharing option for user
                    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); 
                    sharingIntent.setType("text/plain");                    
                    sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, ShortDesc+" from "+BusinessName);
                    sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, ShortDesc+" "+ShareURL);
                    sharingIntent.putExtra(Intent.EXTRA_TITLE, ShortDesc+" "+ShareURL);
                    startActivityForResult(Intent.createChooser(sharingIntent, "Share via"),1000);
/**
     * Get the result when we share any data to another activity 
     * */
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch(requestCode) {
        case 1000:
            if(resultCode == RESULT_OK)
                Toast.makeText(getApplicationContext(), "Activity 1 returned OK", Toast.LENGTH_LONG).show();
            else
                Toast.makeText(getApplicationContext(), "Activity 1 returned NOT OK", Toast.LENGTH_LONG).show();
            break;
        case 1002:
            if(resultCode == RESULT_OK)
                Toast.makeText(getApplicationContext(), "Activity 2 returned OK", Toast.LENGTH_LONG).show();
            break;
        }// end switch



    }// end onActivityResult

1
ShareDialog shareDialog = new ShareDialog(this);
if(ShareDialog.canShow(ShareLinkContent.class)) {

    ShareLinkContent linkContent = new ShareLinkContent.Builder().setContentTitle(strTitle).setContentDescription(strDescription)
                            .setContentUrl(Uri.parse(strNewsHtmlUrl))
                            .build();
    shareDialog.show(linkContent);

}

0

如果你想展示文本,可以在你想分享的信息前面加上#,它将作为Hashtag分享。


0

看起来这是Facebook应用程序中的一个错误,该错误于2011年4月被报告,并且仍然未被Android Facebook开发人员修复。

目前唯一的解决方法是使用他们的SDK。


2
我认为他们希望你使用Web应用程序与朋友分享可共享的内容,以便您可以看到广告... 我也有同样的问题,我将通过Facebook API实现Facebook分享。 - Igor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接