我正在使用以下代码来推送来自其他应用的内容:
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原生。如何获取消息?
答案 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);
希望这会有所帮助,并且如果正确的话,请记住接受答案:)