通过ACTION_SEND从Android App在Facebook上共享文本


91

我有一个Android应用程序,它支持通过其他应用程序发送文本。因此,它使用ACTION_SEND意图和EXTRA_TEXT字段。选择器为我提供了可以处理这种意图的所有应用程序。这些是Twitter,电子邮件,...和Facebook。但是,当我选择Facebook时,它将打开浏览器并转到以下页面:

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

它显示了我的文字和提交按钮。但是当我按下提交按钮时,什么也没有发生。该页面再次加载。我认为也许只能通过Facebook App发送URL。可以吗?

是否有人设法ACTION_SEND通过Facebook Android应用发送文本?


4
如果您访问此SO帖子,并对Facebook应用程序不正确支持ACTION_SEND感到沮丧,请花时间将您的帖子添加到以下主题:forum.developers.facebook.net/viewtopic.php?id=93900
错误454

7
我猜2012年3月21日仍然没有解决?因为我不能得到它的工作..
迭戈

1
developers.facebook.com/bugs/332619626816423-脸书设计团队似乎已经关闭了这个页面,因为预先填写一条消息违反了他们的政策:(
Brett

1
@Brett真是可笑。他们只是想让您将SDK添加到您的项目中。
theblang 2014年

2
2015年5月17日-仍无法使用Facebook。
Faisal Asif

Answers:


11

编辑:随着新的官方官方Facebook应用程序发布的Android(2011年7月14日)它工作!

OLD:如果用户选择用于共享的Facebook应用程序,则上述示例无效,但如果用户选择Seesmic应用程序发布至Facebook,则上述示例有效。我想Seesmic在Facebook API上的实现比Facebook更好!


在Facebook 1.6.1版中,它不起作用,发送时似乎还有一些其他错误!
坐在

它开始工作了!不知道是什么问题。感谢它也可以与FB v 1.6.1一起使用。
坐在

8
自从发布Facebook应用程序1.6.2版本以来,这个答案是错误的:developers.facebook.com/bugs/363863587019268
alaeri 2013年

51

要使Share与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 App,它不起作用)。

我发现使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 api:https : //github.com/facebook/facebook-android-sdk


4
“精彩搜索引擎”文字在哪里?这就是人们在上面报告的错误,是吗?
凯尔·克莱格

3
他是说您只能发布链接。没有文字。必须删除“ Wonderful search engine”文本才能正常工作。
chubbsondubs

如果您更新答案,我会+1。截至目前,该Facebook应用程序将正确地从类似的字符串中提取链接Wonderful search engine http://www.google.fr/。请注意,我说过拉链接,它仍然不会对文本做任何事情。此外,还Twitter可以使用文本和链接。
theblang 2014年

45

06/2013:

  • 这是Facebook的错误,而不是您的代码
  • Facebook不会修复此错误,他们说这是“设计使然”,他们破坏了Android共享系统:https : //developers.facebook.com/bugs/332619626816423
  • 使用SDK或仅共享URL。
  • 提示:您可以使用网页标题作为帖子文字来作弊。

28
非常感谢Faceobook。</
sarcasm

感谢@Loda引起我们的注意
Jigar

28

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

通过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épBlog-通过Android进行高级共享


13
使用仍然无法在Facebook和Twitter中共享文本(仅链接)的方式。您必须使用Android版SDK Facebook(Twitter)。
秘密

您好,我尝试过此操作,但未显示我要在Facebook上共享的消息...知道为什么吗?它要求我登录并显示“您在想什么?” 提示文本不是我要分享的实际文本
Ramesh Sangili

这行不通。它显示与正常(对话)意图相同的空输入。
Ixx 2013年

3
但很容易在推特上发布文本
Trikaldarshi

1
在Facebook上不起作用,并且要在Twitter上启用共享,无需设置意图组件。
Juozas Kontvainis 2014年

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转义该URL生成对话框时,它将读取标题元数据并将其嵌入到您的共享对话框中。

我意识到这是一个非常不错的解决方案,所以请带些盐...


(加一)以供xkcd参考。
Aamir Abro 2014年

2

看来Facebook应用程序错误地处理了此意图。最可靠的方法似乎是使用适用于Android的Facebook API。

SDK的链接如下:http : //github.com/facebook/facebook-android-sdk

在“用法”下,有以下内容:

显示一个Facebook对话框。

SDK支持用于用户交互的多个WebView html对话框,例如创建墙贴。旨在提供快速的Facebook功能,而无需实现本机Android UI并将数据直接通过API传递给Facebook。

这似乎是最好的方法-显示一个将发布到墙上的对话框。唯一的问题是他们可能必须先登录


好吧,这不正是我要的。但是无论如何,谢谢你的提示。我需要为Facebook分享添加一个单独的菜单项才能完成此工作...
Goddchen 2010年

是的,我明白您的意思,这
很不讨人喜欢

3
我刚刚进行了更多搜索,发现整个互联网上都有这个问题的人,而Facebook根本没有帮助。forum.developers.facebook.net/viewtopic.php?pid=255227
HXCaine 2010年

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

看来,这是2011年4月报告的Facebook应用程序中的错误,并且尚未由Android Facebook开发人员修复。

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


2
我认为他们希望您使用Web应用程序与朋友共享可共享的内容,因此您可以看到de Ads ...我也有同样的问题,我将通过facebook api实现Facebbok共享。
伊戈尔(Igor)

0

如果您想显示文本,请在消息的开头加上#号,然后将其共享为#标签

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.