Android Intent for Twitter应用程序

wou*_*r88 61 twitter android android-intent

是否有可能显示一个应用程序列表(intent.createChooser仅),只显示我的手机上的我的推特应用程序(所以htc peep(htc hero)或twitdroid).我试过它,intent.settype("application/twitter")但它没有找到任何Twitter的应用程序,只显示我的邮件应用程序.

谢谢,

沃特

Jon*_*nik 82

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

这主要是推出官方Twitter应用程序,或者如果没有安装,则会显示"使用...完成操作"对话框(如下所示)或直接启动Web浏览器.

有关twitter.com URL中不同参数的列表,请参阅Tweet按钮文档.请记住参数值进行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);
Run Code Online (Sandbox Code Playgroud)

(如果你有一个像这样的小实用程序,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

在此输入图像描述

  • 非常感谢,Jonik!这应该是公认的答案(甚至是Twitter官方回答).`billynomates`的答案也很好,而且更简单.但你所说的正是我们所需要的(直接转到Twitter或回归其他客户),也可能是大多数人想做的事情.如果可以,我会双倍投票.:) (3认同)
  • 关于这个答案最好的部分是选择器似乎也包括流行的第三方Twitter客户端(如果已安装) (2认同)

Der*_*rzu 39

之前发布的解决方案允许您直接在第一个Twitter应用上发布.要显示twitters应用程序列表(如果有多个),您可以自定义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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 只是一个细节:"twi"获得Twitter和Twicca,但是错过了许多其他客户,如TweetCaster,HootSuite和Plume. (2认同)

Ale*_*erg 34

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

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

"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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要对不同的提供程序进行一些实验,但如果名称以".SendTweet"结尾,则您非常安全(这是Twidroyd中的活动名称).您还可以检查调试器是否要使用包名称,并相应地调整字符串比较(即Twidroyd使用"com.twidroid.*").

在这个简单的例子中,我们只选择我们找到的第一个匹配活动.这直接打开了Twitter客户端,用户无需做出任何选择.如果没有合适的Twitter客户端,我们将恢复为标准活动选择器:

startActivity(resolved ? tweetIntent :
    Intent.createChooser(tweetIntent, "Choose one"));
Run Code Online (Sandbox Code Playgroud)

您可以扩展代码并考虑有多个Twitter客户端的情况,当您可能想要从找到的所有活动名称创建自己的选择器对话框时.

  • "application/twitter"不是官方的MIME类型.因此,它仅由twitdroid支持.至于`sendTweet`方法名称,我认为它更受限制 (5认同)

Com*_*are 23

您的用户完全有可能现在和永远只想发布到Twitter.

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

在这种情况下,使用ACTION_SEND,描述在这里.特别是Twidroid支持ACTION_SEND,因此它将出现在可用的传递机制列表中.

  • 有些应用程序希望限制发布Twitter,这就是这里要求的.使用Twitter API是一个重新发明的轮子b-重复HTC /三星/ Twitter已经提供的c-复杂(验证,重新发布,如果失败,小网址等) (23认同)
  • `ACTION_SEND`太模糊了.Gmail和Dropbox符合条件.[我建议你过滤](http://regis.decamps.info/blog/2011/06/intent-to-open-twitter-client-on-android/)基于已知包名的列表. (7认同)
  • @rds:`ACTION_SEND`不是"太模糊".还有很多其他地方用户想要分享内容 - 正如我在答案中写的那样,理想情况下,应用程序并不限制用户仅通过Twitter共享.而且你的过滤器"太脆弱"和"太危险",因为它依赖于一小部分Twitter客户端的未记录信息.如果您只想分享到Twitter,请使用Twitter客户端API. (6认同)

Spe*_*eed 17

这些答案都过于复杂.

如果你只是对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);
Run Code Online (Sandbox Code Playgroud)


rds*_*rds 9

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

  • 请参阅http://regis.decamps.info/blog/2011/06/intent-to-open-twitter-client-on-android/以实现此理念 (2认同)