Android Intent for Twitter应用程序

是否有可能显示一个应用程序列表( intent.createChooser ),只显示我的我的推特应用程序在我的手机上(所以htc窥视(htc英雄)或twitdroid)。 我试图与intent.settype("application/twitter")但它没有find任何应​​用程序的Twitter和只显示我的邮件应用程序。

谢谢,

沃特

这是完全可能的,你的用户将永远只有永远只想发布到Twitter。

我认为你的用户更愿意把信息发送给人,而Twitter是一种可能性。 但是,他们可能还想发送短信或电子邮件等。

在这种情况下,使用ACTION_SEND ,如下所述。 Twidroid特别支持ACTION_SEND ,所以它会出现在可用的传递机制列表中。

我发布这个,因为我还没有看到一个解决scheme,但确实是我想要的。

这主要是推出官方的Twitter应用程序 ,或者如果没有安装,或者提出一个“完成操作使用…”对话框( 像这样 )或直接启动一个网页浏览器。

有关twitter.comurl中不同参数的列表,请参阅Tweet Button文档 。 记住要对参数值进行URL编码 。 (这个代码是专门用来发送一个URL的,如果你不想要的话,只是省略了url参数。)

 // Create intent using ACTION_VIEW and a normal Twitter url: String tweetUrl = String.format("https://twitter.com/intent/tweet?text=%s&url=%s", urlEncode("Tweet text"), urlEncode("https://www.google.fi/")); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(tweetUrl)); // Narrow down to official Twitter app, if available: List<ResolveInfo> matches = getPackageManager().queryIntentActivities(intent, 0); for (ResolveInfo info : matches) { if (info.activityInfo.packageName.toLowerCase().startsWith("com.twitter")) { intent.setPackage(info.activityInfo.packageName); } } startActivity(intent); 

(如果你有一个这样的小工具,比如“StringUtils”,URL编码更清晰。)

 public static String urlEncode(String s) { try { return URLEncoder.encode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { Log.wtf(TAG, "UTF-8 should always be supported", e); throw new RuntimeException("URLEncoder.encode() failed for " + s); } } 

例如,在我的Nexus 7设备上, 直接打开官方Twitter应用程序 :

在这里输入图像描述

如果官方Twitter应用程序没有安装,用户selectChrome或自动打开(作为唯一可以处理意图的应用程序):

在这里输入图像描述

之前发布的解决scheme,允许您直接发布您的第一个twitter应用程序。 要显示推特应用程序列表(如果有多个),你可以自定义你的Intent.createChooser只显示你想要的Itents。

技巧是将EXTRA_INITIAL_INTENTS添加到从createChoose生成的默认列表中,并从列表中删除其他Intents。

看看这个示例,我创build一个select器,只显示我的电子邮件应用程序。 在我的情况下出现三封邮件:Gmail,YahooMail和默认的邮件。

 private void share(String nameApp, String imagePath) { List<Intent> targetedShareIntents = new ArrayList<Intent>(); Intent share = new Intent(android.content.Intent.ACTION_SEND); share.setType("image/jpeg"); List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(share, 0); if (!resInfo.isEmpty()){ for (ResolveInfo info : resInfo) { Intent targetedShare = new Intent(android.content.Intent.ACTION_SEND); targetedShare.setType("image/jpeg"); // put here your mime type if (info.activityInfo.packageName.toLowerCase().contains(nameApp) || info.activityInfo.name.toLowerCase().contains(nameApp)) { targetedShare.putExtra(Intent.EXTRA_TEXT, "My body of post/email"); targetedShare.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(imagePath)) ); targetedShare.setPackage(info.activityInfo.packageName); targetedShareIntents.add(targetedShare); } } Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "Select app to share"); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[]{})); startActivity(chooserIntent); } } 

你可以这样运行:share(“twi”,“/sdcard/dcim/Camera/photo.jpg”);

这是基于post: 基于安装的Android包名称的意向select器的自定义筛选

这个问题有点老,但是因为我刚刚遇到了类似的问题,所以也可能是其他人感兴趣的。 首先,正如彼得所说的,创造你的意图:

 Intent tweetIntent = new Intent(Intent.ACTION_SEND); tweetIntent.putExtra(Intent.EXTRA_TEXT, "Test; please ignore"); tweetIntent.setType("application/twitter"); 

“application / twitter”其实是一个已知的内容types,请看这里 。 现在,当你试图用这个意图开始一个活动时,它会显示各种不是真正Twitter客户端的应用程序,但是需要一些操作。 正如前面已经提到的,“你为什么要这样做呢?” 有些用户可能会觉得有用。 另一方面,如果我在我的应用程序中有一个button“Tweet this!”,用户就非常希望能够打开一个Twitter客户端。

这意味着,我们不是仅仅启动一个活动,而是需要筛选出合适的活动:

 PackageManager pm = getPackageManager(); List<ResolveInfo> lract = pm.queryIntentActivities(tweetIntent, PackageManager.MATCH_DEFAULT_ONLY); boolean resolved = false; for(ResolveInfo ri: lract) { if(ri.activityInfo.name.endsWith(".SendTweet")) { tweetIntent.setClassName(ri.activityInfo.packageName, ri.activityInfo.name); resolved = true; break; } } 

你需要尝试一下不同的提供者,但是如果名字以“.SendTweet”结尾,那么你很安全(这是Twidroyd中的活动名称)。 你也可以检查你的debugging器你想使用的包名称,并相应地调整string比较(例如Twidroyd使用“com.twidroid。*”)。

在这个简单的例子中,我们只是select我们find的第一个匹配的活动。 这直接带来了Twitter客户端,而无需用户做出任何select。 如果没有合适的Twitter客户端,我们回到标准的活动select器:

 startActivity(resolved ? tweetIntent : Intent.createChooser(tweetIntent, "Choose one")); 

您可以扩展代码,并考虑到有多个Twitter客户端的情况,您可能希望从所find的所有活动名称中创build自己的select器对话框。

这些答案都过于复杂。

如果你只是做一个正常的URL的意图,做Twitter.com,你会得到这个屏幕:

在这里输入图像描述

如果您没有安装Twitter应用程序,您可以select进入网站。

 String url = "https://twitter.com/intent/tweet?source=webclient&text=TWEET+THIS!"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); 

  • 您使用Intent.ACTION_SENDtext/plain MIMEtypes的Intent开始一个活动。 您将拥有支持发送文本的所有应用程序。 这应该是任何Twitter客户端,以及Gmail,Dropbox等
  • 或者,您尝试查找您知道的每个客户端的具体操作 ,例如官方客户端的“com.twitter.android.PostActivity” 。 这将指向这个客户,这不可能是一个完整的清单。
  • 或者,你从第二点开始,然后回到第一点…

不。 意图types是像image/pngapplication/pdf ,即文件types,并与createChooser你基本上是问哪些应用程序可以打开这种文件types。

现在,没有可以打开的application/twitter文件,所以这是行不通的。 我不知道有什么其他方式可以达到你想要的。

http://twidroid.com/plugins/

Twidroid的ACTION_SEND意图

 Intent sendIntent = new Intent(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is a sample message via Public Intent"); sendIntent.setType("application/twitter"); startActivity(Intent.createChooser(sendIntent, null)); 

我使用“billynomates”的答案,并能够使用“URLEncoder.encode(,”UTF-8“)”function使用主题标签。 哈希标签显示得很好。

 String originalMessage = "some message #MESSAGE"; String originalMessageEscaped = null; try { originalMessageEscaped = String.format( "https://twitter.com/intent/tweet?source=webclient&text=%s", URLEncoder.encode(originalMessage, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if(originalMessageEscaped != null) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(originalMessageEscaped)); startActivity(i); } else { // Some Error }