使用Android应用程序的意图进行推文

时间:2012-10-16 09:01:07

标签: android android-intent

我正在使用以下代码来推送来自其他应用的内容:

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原生。如何获取消息?

2 个答案:

答案 0 :(得分:2)

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

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

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

1)使用他们的API(可能使用诸如twitter4j之类的库)或

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

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是最好的,因为它只取决于你的应用程序(好吧,除了库),你不必与用户可能拥有或不拥有的第三方应用程序集成。

答案 1 :(得分: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);

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