62

intent.createChooser是否可以显示仅在手机上显示我的 Twitter 应用程序的应用程序列表(带有)(因此 htc peep (htc hero) 或 twitdroid)。我已经尝试过了,intent.settype("application/twitter")但它没有找到任何适用于 twitter 的应用程序,只显示我的邮件应用程序。

谢谢,

沃特

4

9 回答 9

83

我发布这个是因为我还没有看到完全符合我要求的解决方案。

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

有关 twitter.com URL 中不同参数的列表,请参阅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 应用程序并且用户选择 Chrome 或它自动打开(作为唯一可以处理意图的应用程序):

在此处输入图像描述

于 2014-01-17T13:04:38.360 回答
40

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

诀窍是将 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");

这是基于帖子:基于已安装的 Android 包名称的意图选择器的自定义过滤

于 2012-02-05T18:51:01.230 回答
34

这个问题有点老了,但是由于我刚刚遇到了类似的问题,因此其他人可能仍然对其感兴趣。首先,正如彼得所说,创建你的意图:

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

“application/twitter”实际上是一种已知的内容类型,请参见此处。现在,当您尝试使用此意图启动一个活动时,它会显示各种不是真正的 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 客户端的情况。

于 2011-01-17T16:32:15.817 回答
23

您的用户完全有可能永远、现在和永远只想在 Twitter 上发帖。

我认为您的用户更有可能希望向人们发送信息,而 Twitter 是一种可能性。但是,他们可能还想发送短信或电子邮件等。

在这种情况下,请使用,如此ACTION_SEND所述。值得注意的是,Twidroid 支持,因此它将出现在可用交付机制列表中。ACTION_SEND

于 2010-01-16T12:41:26.957 回答
17

这些答案都过于复杂。

如果你只是对 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);
于 2013-05-09T14:28:46.260 回答
9

任何一个

  • 您使用带有操作Intent.ACTION_SENDtext/plainMIME 类型的 Intent 启动活动。您将拥有所有支持发送文本的应用程序。那应该是任何 twitter 客户端,以及 Gmail、Dropbox 等。
  • 或者,您尝试查找您知道的每个客户端的特定操作,例如官方客户端的“com.twitter.android.PostActivity”。这将指向这个客户,这不太可能是一个完整的列表。
  • 或者,你从第二点开始,然后回到第一点......
于 2011-03-13T19:30:57.083 回答
4

没有。意图类型类似于image/pngor application/pdf,即文件类型,使用 createChooser 基本上是在询问哪些应用程序可以打开此文件类型。

现在,没有application/twitter可以打开的文件,所以这行不通。我也不知道有任何其他方式可以实现您想要的。

于 2010-01-16T11:42:58.960 回答
3

来自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)); 
于 2010-01-27T13:33:58.013 回答
3

我使用了“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
}
于 2013-08-14T14:58:21.517 回答