是否可以使用 intent.createChooser
显示一个应用程序列表,其中仅显示我在手机上的 Twitter 应用程序(例如 htc peep (htc hero) 或 twitdroid)?我尝试过使用 intent.settype("application/twitter")
但它无法找到任何 Twitter 应用程序,只显示我的邮件应用程序。
谢谢,
Wouter
是否可以使用 intent.createChooser
显示一个应用程序列表,其中仅显示我在手机上的 Twitter 应用程序(例如 htc peep (htc hero) 或 twitdroid)?我尝试过使用 intent.settype("application/twitter")
但它无法找到任何 Twitter 应用程序,只显示我的邮件应用程序。
谢谢,
Wouter
我发布这篇文章是因为我还没有看到一个完全符合我的需求的解决方案。
主要是启动官方Twitter应用程序,如果未安装,则会弹出"使用以下操作完成"对话框 (像这样) 或直接启动Web浏览器。
有关twitter.com URL中不同参数的列表,请参见Tweet Button文档。记得对参数值进行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应用程序,并且用户选择Chrome或它自动打开(作为唯一可以处理该意图的应用程序):
billynomates
的回答也不错,而且更简单。但是你所说的正是我们所需要的(直接去Twitter或者返回其他客户端),并且可能是大多数人想要做的。如果我可以的话,我会投两票的。 :) - Ferran Maylinchprivate 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
这个问题有点旧,但是因为我刚碰到了类似的问题,所以它可能仍然对其他人感兴趣。首先,如Peter所提到的,创建你的意图:
Intent tweetIntent = new Intent(Intent.ACTION_SEND);
tweetIntent.putExtra(Intent.EXTRA_TEXT, "Test; please ignore");
tweetIntent.setType("application/twitter");
"application/twitter"实际上是一个已知的内容类型,可以在这里找到相关信息。当你尝试使用这个意图启动一个活动时,它会显示所有不是真正的Twitter客户端但想要一份“大餐”的应用程序。就像一些“为什么你甚至要那样做?”这样的答案中已经提到的那样,一些用户可能会觉得这很有用。另一方面,如果我在我的应用程序中有一个按钮,上面写着“发推文!”,那么用户非常希望能弹出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.*”)。startActivity(resolved ? tweetIntent :
Intent.createChooser(tweetIntent, "Choose one"));
您可以扩展代码并考虑存在多个 Twitter 客户端的情况,当您可能希望从找到的所有活动名称中创建自己的选择对话框时。
sendTweet
方法名,我认为它更为严格限制。 - rds完全有可能你的用户现在和将来只想要发布推文。
我认为更有可能的情况是,你的用户想要向别人发送信息,Twitter 只是其中一种可能。但是,他们也可能想要发送短信或电子邮件等。
如果是这样的话,请使用 ACTION_SEND
,具体说明可以参考 这里。值得一提的是,Twidroid 支持 ACTION_SEND
,因此它将出现在可用交付机制的列表中。
ACTION_SEND
并不是“太模糊了”。用户在许多其他地方也想要分享东西--正如我在答案中所写的那样,理想情况下,应用程序不应仅限制用户通过Twitter分享。而你的过滤器“太脆弱”和“太危险”,因为它依赖于来自一小部分Twitter客户端的未记录信息。如果你只想分享到Twitter,请使用Twitter客户端API。 - CommonsWare这些答案都过于复杂。
如果您只是执行一个普通的URL意图,然后跳转到Twitter.com,您将会看到这个屏幕:
如果您没有安装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);
https://mobile.twitter.com/...
一起使用,必须是 https://twitter.com/...
。此外,这对于hashtags也不起作用。 - Kyle Falconer要么
Intent.ACTION_SEND
和text/plain
MIME类型的Intent启动活动。您将拥有所有支持发送文本的应用程序。这应该是任何Twitter客户端,以及Gmail、dropbox等。不行。意图类型是类似于image/png
或application/pdf
,也就是文件类型。而使用createChooser,你基本上是在询问哪些应用程序可以打开此文件类型。
现在,没有可以打开的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”)”函数能够使用哈希标签。 哈希标签正常显示。
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
}