这个问题有点老了,但是由于我刚刚遇到了类似的问题,因此其他人可能仍然对其感兴趣。首先,正如 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 客户端的情况,此时您可能希望从找到的所有活动名称中创建自己的选择器对话框。