安卓分享意图选择器 - 通过社交媒体如Facebook/Twitter分享文本

6
如果我只发送文本,则分享意图选择器不会提供Facebook/Twitter作为选项。只有Gmail、Skype和Evernote是可选项。以下是我的代码。
Intent shareIntent = new Intent(Intent.ACTION_SEND);

shareIntent.setType("plain/text");
shareIntent.putExtra(Intent.EXTRA_TEXT, text)
startActivity(Intent.createChooser(shareIntent, "Share using"));

我尝试了不同的setType()组合,包括"text/*"、"text/html"以及在putExtra中传递HTML文本,但都没有成功。

shareIntent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml("<p>This is the text that will be shared.</p>"));

当我使用"text/plain"时,Facebook会出现选项,但在选择它时文本不会加载。但是在分享到Twitter、电子邮件和短信时可以加载文本。
有其他人遇到过这个问题吗?
当我分享图片时,没有问题,并且Facebook以及其他社交媒体应用程序都在列表中可用。

答案在这里找到:https://dev59.com/R3A75IYBdhLWcg3wBkO1 - tiptopjat
4个回答

8
同时根据文档,应该是"text/plain"而非"plain/text"。

这就是导致这里问题的原因。谢谢。 - jfcartier

3
这取决于这些应用程序定义了哪些意图过滤器。例如,如果我添加intent-filterandroid.intent.action.send,当我从相册选择单个图像时,我的应用程序将出现在列表中。但是,如果我选择多个图像,则我的应用程序不会出现,因为我没有添加android.intent.action.send_multiple的意图过滤器。
所以这取决于Facebook正在过滤哪些意图。您需要查看发行说明、帮助或开发人员页面才能确定。

1
我找到了一个深入涵盖这个问题的页面。通过在我的字符串文本中包含URL,例如“嗨,看看http://www.bbc.co.uk”,Facebook可以识别该字符串。奇怪的是,只有字符串的URL部分。Twitter可以识别整个字符串以及URL。https://dev59.com/R3A75IYBdhLWcg3wBkO1 - tiptopjat

2

Facebook问题是由于Facebook权限的限制。请使用Facebook API。


1
分享至 Twitter:

Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");

shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, (String)v.getTag(R.string.app_name));

shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, (String)v.getTag(R.drawable.ic_launcher));

// 查找Twitter包的名称 ---- >>

   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;
          }
        }

分享至Facebook
   Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
   shareIntent.setType("text/plain");
   shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,String)v.getTag(R.string.app_name));

   shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, (String) 

v.getTag(R.drawable.ic_launcher));

// finding facebook package name 

   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;
        }
      }

通过Gmail分享
  Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);

   shareIntent.setType("text/plain");         

shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT(String)v.getTag(R.string.app_name));

 shareIntent.putExtra(android.content.Intent.EXTRA_TEXT(String)v.getTag(R.drawable.ic_launcher));

// finding gmail package name  --- 

  PackageManager pm = v.getContext().getPackageManager();

   List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);

       for (final ResolveInfo app : activityList) 
        {
          if ((app.activityInfo.name).contains("gmail")) 
           {
             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;
           }
       }

所有社交媒体都没有一个单一的意图过滤器吗? - Taslim Oseni
如果你使用ACTION_SEND,它至少会显示Whatsapp、Twitter、Instagram和Facebook,而不考虑其他也可以响应该意图操作的应用程序,如Gmail。请参见此链接:https://developer.android.com/training/sharing/send#using-android-system-sharesheet - FabioR

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