92

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

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

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

有没有人设法ACTION_SEND通过 Facebook Android 应用程序发送文本?

4

10 回答 10

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 应用程序,它不起作用)。

我发现使 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

于 2011-02-11T08:35:23.390 回答
46

06/2013 :

  • 这是来自 Facebook 的错误,而不是您的代码
  • Facebook 不会修复这个错误,他们说他们破坏了 Android 共享系统是“设计使然” : https ://developers.facebook.com/bugs/332619626816423
  • 使用 SDK 或仅共享 URL。
  • 提示:您可以使用网页标题作为帖子的文本来作弊。
于 2013-06-05T07:28:04.637 回答
29

首先,您需要查询 Intent to handler 共享选项。然后使用包名过滤Intent,那么我们将只有一个Intent那个handler共享选项!

通过 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 博客中找到它 - 通过 Android 进行高级共享

于 2012-04-13T20:41:12.863 回答
11

已编辑:随着适用于 Android 的官方 Facebook 应用程序的新版本(2011 年 7 月 14 日)它可以正常工作!!!

OLD:如果用户选择 Facebook 应用程序进行分享,上述示例不起作用,但如果用户选择 Seesmic 应用程序发布到 Facebook,它们确实有效。我猜 Seesmic 比 Facebook 有更好的 Facebook API 实现!

于 2011-06-13T05:49:35.057 回答
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 以生成对话框时,它将读取标题元数据并将其嵌入到您的共享对话框中。

我意识到这是一个非常糟糕的解决方案,所以带上一粒盐......

于 2012-12-21T01:08:31.203 回答
2

Facebook 应用程序似乎错误地处理了这个意图。最可靠的方法似乎是使用 Facebook API for Android。

SDK 位于此链接:http: //github.com/facebook/facebook-android-sdk

在“用法”下,有这个:

显示 Facebook 对话框。

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

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

于 2010-09-14T21:02:22.470 回答
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
于 2013-12-12T12:21:28.843 回答
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);

}
于 2016-12-07T16:23:50.787 回答
0

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

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

于 2011-09-25T17:39:52.987 回答
0

如果你想在你想要的消息的乞求处显示文本放置#它将作为 Hashtag 共享

于 2016-07-24T06:55:07.437 回答