Twitter应用程序的Android Intent
Posted
技术标签:
【中文标题】Twitter应用程序的Android Intent【英文标题】:Android Intent for Twitter application 【发布时间】:2011-01-05 19:52:29 【问题描述】:是否可以显示一个应用程序列表(使用intent.createChooser
),只显示我手机上的推特应用程序(所以 htc peep (htc hero) 或 twitdroid)。我用intent.settype("application/twitter")
试过了,但它没有找到任何推特应用程序,只显示我的邮件应用程序。
谢谢,
沃特
【问题讨论】:
Twitter,通过 fabric 已经为此创建了一个库。搜索此解决方案的人现在可以在此处找到它。 docs.fabric.io/android/twitter/compose-tweets.html#set-up-kit希望这会有所帮助。 【参考方案1】:我发布此内容是因为我还没有看到完全符合我要求的解决方案。
这主要是启动官方 Twitter 应用程序,或者如果未安装,则打开“使用...完成操作”对话框 (like this) 或直接启动网络浏览器。
有关 twitter.com URL 中不同参数的列表,请参阅Tweet Button docs。
记得URL encode参数值。 (此代码专门用于发布 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);
(如果你在某个地方有这样的小实用程序,URL 编码会更简洁,例如“StringUtils”。)
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 设备上,这直接打开official Twitter app:
如果官方 Twitter 应用没有安装并且用户要么选择 Chrome 要么它自动打开(作为唯一可以处理意图的应用):
【讨论】:
这个答案最好的部分是选择器似乎还包括流行的第 3 方 Twitter 客户端(如果已安装) 非常感谢,乔尼克!这应该是公认的答案(甚至是 Twitter 官方答案)。billynomates
的回答也不错,也比较简单。但你所说的正是我们需要的(直接访问 Twitter 或回退到其他客户端),并且可能是大多数人想要做的。如果可以的话,我会双重投票。 :)
好答案!效果很好。您知道是否可以使用此 URL 填充来包含例如推文的图像 URL,或者如果安装了 Twitter 应用程序,则将此信息作为 Intent Extra 数据发送?
@Matti:抱歉,我不知道。试试看它是否有效:)
非常简短、简单而强大的解决方案!非常感谢!【参考方案2】:
之前发布的解决方案,允许您直接在您的第一个 Twitter 应用上发布。要显示 twitter 应用列表(如果有多个),您可以自定义 Intent.createChooser 以仅显示您想要的 Itent。
诀窍是将 EXTRA_INITIAL_INTENTS 添加到从 createChoose 生成的默认列表中,然后从列表中删除其他 Intent。
看看这个示例,我在其中创建了一个仅显示我的电子邮件应用程序的选择器。在我的例子中,出现了三封邮件: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");
这是基于帖子:Custom filtering of intent chooser based on installed Android package name
【讨论】:
只是一个细节:“twi”获得了 Twitter 和 Twicca,但错过了许多其他客户,例如 TweetCaster、HootSuite 和 Plume。 @Pierre-LucPaour 你是对的。可以调整代码以尝试匹配多个应用程序部分名称。我认为没有办法在不知道这些应用程序的名称或部分名称的情况下显示所有(并且只是)twitter 应用程序。还有其他方法吗? alexander-rautenberg 的解决方案适用于所有 Twitter 应用吗? 我只是想向未来的读者指出,他们确实需要清点各种 Twitter 客户端及其命名,而不是盲目地使用此代码。 先生,请帮助我使用此代码进行图像共享和文本,当我调用此方法时,ti 将崩溃请帮助我该怎么做。请帮助 @RishiGautam 请发布您的异常堆栈跟踪。【参考方案3】:这个问题有点老了,但是由于我刚刚遇到了类似的问题,因此其他人可能仍然对其感兴趣。首先,正如 Peter 所说,创建您的意图:
Intent tweetIntent = new Intent(Intent.ACTION_SEND);
tweetIntent.putExtra(Intent.EXTRA_TEXT, "Test; please ignore");
tweetIntent.setType("application/twitter");
“application/twitter”实际上是一种已知的内容类型,参见here。现在,当您尝试使用此意图启动一个活动时,它会显示各种不是真正的 Twitter 客户端但想要参与其中的应用程序。正如在几个“你为什么要这样做?”中已经提到的那样。排序的答案,一些用户可能会发现这很有用。另一方面,如果我的应用中有一个按钮,上面写着“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 中的活动名称)。您还可以检查您的调试器是否有您想要使用的包名称并相应地调整字符串比较(即 Twidroyd 使用“com.twidroid.*”)。
在这个简单的示例中,我们只选择我们找到的第一个匹配活动。这会直接启动 Twitter 客户端,而无需用户做出任何选择。如果没有合适的 Twitter 客户端,我们将恢复为标准活动选择器:
startActivity(resolved ? tweetIntent :
Intent.createChooser(tweetIntent, "Choose one"));
您可以扩展代码并考虑到存在多个 Twitter 客户端的情况,此时您可能希望从找到的所有活动名称中创建自己的选择器对话框。
【讨论】:
"application/twitter" 不是官方的 MIME 类型。因此,它仅受 twitdroid 支持。至于sendTweet
method 的名字,我觉得更严格
我最终将你的想法与 rds 的博客链接混合使用,但如果我没有找到适合发推文的任何应用程序,我会使用他们的 url 分享评论 (twitter.com/home?status=Hi+There)
先生帮帮我,尝试在 twitter 上发送图像但没有成功请帮助我如何发送图像。如果你有示例代码,请与我分享
我认为它甚至没有显示 Twitter...我使用了 Jonik 的答案。【参考方案4】:
您的用户完全有可能永远、现在和永远只想在 Twitter 上发帖。
我认为您的用户更有可能希望向人们发送信息,而 Twitter 是一种可能性。但是,他们可能还想发送短信或电子邮件等。
在这种情况下,请使用ACTION_SEND
,如here 所述。值得注意的是,Twidroid 支持ACTION_SEND
,因此它会出现在可用的交付机制列表中。
【讨论】:
ACTION_SEND
太模糊了。 Gmail 和 Dropbox 符合条件。 I suggest you filter 基于已知包名的列表。
@rds: ACTION_SEND
不是“太模糊”。还有很多其他用户想要分享东西的地方——正如我在回答中所写的那样,理想情况下,应用程序不会限制用户只能通过 Twitter 分享。而且您的过滤器“太脆弱”和“太危险”,因为它依赖于来自一小部分 Twitter 客户的无证信息。如果您只想分享到 Twitter,请使用 Twitter 客户端 API。
一些应用程序希望限制在 Twitter 上发帖,这就是这里所要求的。使用 twitter API 是 a- 重新发明*** b- HTC/Samsung/twitter 已经提供的复制品 c- 复杂(身份验证、失败时重新发布、小 URL 等)
@CommonsWare 我同意这个问题很模糊,但你真的没有回答。就我而言,我想为特定用户打开一个 twitter 页面,可以选择使用该应用程序或浏览器作为后备,您的答案仅涵盖提出问题的人打算通过 twitter 发送信息的假设,而不是检索它,这是我的意图。
嗯,是的,但是用户会对我的应用程序做出不好的评价,而不是 Facebook。对他们来说,这看起来像是我的应用程序的错误。而且集成SDK的应用也很多,很难知道是Facebook的错。【参考方案5】:
这些答案都过于复杂。
如果你只是对 Twitter.com 做一个普通的 url Intent,你会得到这个屏幕:
如果您没有安装 Twitter 应用程序,您可以选择访问该网站。
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);
【讨论】:
这对我不起作用。我得到了提示,但只有 Chrome 和 Firefox 显示,即使我安装了 Twitter。事实证明,它不适用于https://mobile.twitter.com/...
,并且必须是https://twitter.com/...
此外,这不适用于主题标签。【参考方案6】:
要么
您使用带有操作Intent.ACTION_SEND
和text/plain
MIME 类型的Intent 启动活动。您将拥有所有支持发送文本的应用程序。应该是任何 twitter 客户端,以及 Gmail、Dropbox 等。
或者,您尝试look up for the specific action 您知道的每个客户,例如"com.twitter.android.PostActivity" for the official client。这将指向这个客户,这不太可能是一个完整的列表。
或者,您从第二点开始,然后退回到第一点...
【讨论】:
请参阅regis.decamps.info/blog/2011/06/… 了解此想法的实施 感谢您指向我的博客。我的实现的一个问题是当 facebook 应用程序在另一个活动中处于前台时,它不会正确打开帖子意图。 @rds 先生 csn 你帮我先生我尝试发布图像但没有成功请帮我先生 对于那些想要启动官方 Twitter 应用程序的人,here's how to do it easily and reliably.【参考方案7】:不。 Intent 类型类似于 image/png
或 application/pdf
,即文件类型,而使用 createChooser,您基本上是在询问哪些应用可以打开此文件类型。
现在,没有可以打开的application/twitter
文件,所以这不起作用。我不知道还有什么其他方法可以实现你想要的。
【讨论】:
所以我将不得不使用作为类型 (text/*) 以便它向我展示包括 twitter 在内的所有可能性?或者我必须为我的应用编写自己的 Twitter 状态更新 :) 确实不是官方的 MIME 类型。因此,它仅受 twitdroid 支持 先生在推特上分享图片我尝试了很多代码都没有成功请帮帮我先生 先生,我尝试将图像发布在推特墙上先生,请如何将图像发布在推特墙上,如果您有示例代码,请与我分享,谢谢【参考方案8】:来自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));
【讨论】:
它不是官方的 MIME 类型。因此,它仅受 twitdroid 支持【参考方案9】:我使用了“billynomates”答案,并且能够通过使用“URLEncoder.encode(, “UTF-8”)”函数来使用主题标签。哈希标签显示得很好。
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
【讨论】:
以上是关于Twitter应用程序的Android Intent的主要内容,如果未能解决你的问题,请参考以下文章
使用twitter4j库的Twitter Android登录错误
使用 oauth 和 twitter4j 集成 Android Twitter