3

我正在使用以下代码从另一个应用程序中发布推文:

try{
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.putExtra(Intent.EXTRA_TEXT, "It's a Tweet!" + "#MyApp");
        intent.setType("text/plain");
        final PackageManager pm = getPackageManager();
        final List<?> activityList = pm.queryIntentActivities(intent, 0);
        int len =  activityList.size();
        for (int i = 0; i < len; i++) {
            final ResolveInfo app = (ResolveInfo) activityList.get(i);
            if ("com.twitter.android.PostActivity".equals(app.activityInfo.name)) {
                final ActivityInfo activity=app.activityInfo;
                final ComponentName x=new ComponentName(activity.applicationInfo.packageName, activity.name);
                intent=new Intent(Intent.ACTION_SEND);
                intent.addCategory(Intent.CATEGORY_LAUNCHER);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
                intent.setComponent(x);
                intent.putExtra(Intent.EXTRA_TEXT, "blah blah" );
                startActivity(intent);
                break;
            }
        }
    } catch(final ActivityNotFoundException e) {
        Log.i("Twitter intent", "no twitter native", e );
    }

如果 twitter 应用程序已安装在手机上但未打开,则上述代码可以完美运行。但是,如果我在使用上述活动之前使用 twitter,那么我只是简单地转移到我上次离开 twitter 的同一点,并且我想发推文的文本不会发布。我应该怎么做才能纠正这个?

另外,如果我的手机上没有安装 twitter,那么什么也不会发生。在按下启动上述意图的按钮时,没有任何反应,但我实际上不应该收到消息 - 没有 Twitter 原生。应该怎么做才能收到消息??

4

2 回答 2

2

我认为您应该使用 setClassName 而不是 setComponent。

  intent.setClassName("com.twitter.android", "com.twitter.android.PostActivity");

但作为一个有用的旁注,您可以通过多种方式与 twitter 集成:

1)使用他们的 API(可能使用twitter4j等库),或

2) 找到一种与 Twitter 应用程序集成的方法,就像你现在正在做的那样。这不是一个好主意,因为许多人使用其他应用程序,例如 Plume、TweetDeck 等,如果他们没有安装 twitter,您的应用程序将无法运行。

3)您可以使用简单的意图打开http://twitter.com/?status= 。这可以像这样完成:

  Intent i = new Intent(Intent.ACTION_VIEW);
  i.setData(Uri.parse("http://twitter.com/?status=" + Uri.encode(message)));
  startActivity(i);

您也可以将 2 和 3 结合使用。您可以尝试一些已知的 twitter 应用程序,如果它们不存在,请调用浏览器。

另请注意,如果应用程序处理正确的意图,方法 3 可能会实际启动应用程序而不是浏览器(或至少让用户在两者之间进行选择)。

在我看来,方法 1 是最好的,因为它只取决于您的应用程序(当然,库除外),并且您不必与用户可能拥有或不拥有的第三方应用程序集成。

于 2012-10-16T09:14:09.060 回答
1

为 Intent.FLAG_ACTIVITY_CLEAR_TASK 简单地删除 Intent.FLAG_ACTIVITY_NEW_TASK,这样 twitter 正在运行的任务就会重新启动。

您的标志现在应该如下所示:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK
        | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

希望这会有所帮助,如果正确,请记住接受答案:)

于 2012-12-19T19:03:33.547 回答