【发布时间】:2012-02-14 11:54:55
【问题描述】:
我正在使用库 SocialLib 向我的应用程序添加共享功能。我在 oAuth 回调方面遇到了真正的问题。
我创建了以下 Activity 来处理共享:
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import oauth.signpost.exception.OAuthNotAuthorizedException;
import android.app.Activity;
import android.app.ProgressDialog;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import com.expertiseandroid.lib.sociallib.connectors.SocialNetworkHelper;
import com.expertiseandroid.lib.sociallib.connectors.TwitterConnector;
import com.expertiseandroid.lib.sociallib.exceptions.NotAuthentifiedException;
public class ShareActivity extends Activity {
protected final static String TAG = "ShareActivity";
private final Activity activity = this;
public static final int SERVICE_TWITTER = 0;
public static final int SERVICE_FACEBOOK = 1;
public static final int SERVICE_LINKEDIN = 2;
// twitter API
protected static String TWITTER_KEY = "";
protected static String TWITTER_SECRET = "";
protected static String TWITTER_CALLBACK = "myapp://twitter";
protected static String stringToShare = "Hello World";
// connectors
private static TwitterConnector twitter;
/**
* @see android.app.Activity#onCreate(Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = this.getIntent().getExtras();
Uri uri = this.getIntent().getData();
if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK)) {
postTweet();
}
else {
switch (bundle.getInt("service")) {
case SERVICE_TWITTER:
twitterAuth();
break;
default:
break;
}
}
}
public void twitterAuth() {
twitter = SocialNetworkHelper.createTwitterConnector(TWITTER_KEY, TWITTER_SECRET, TWITTER_CALLBACK);
}
public void postTweet() {
twitter.authorize(activity);
twitter.tweet(stringToShare);
finish();
}
}
我想从中分享的活动 (MainActivity) 我调用以下命令来启动 ShareActivity:
Intent intent = new Intent(getApplicationContext(), ShareActivity.class);
intent.putExtra("service", ShareActivity.SERVICE_TWITTER);
startActivity(intent);
我正在使用 Intent 过滤器,以便 Twitter (oAuth) 可以回调调用活动:
<activity android:name=".MainActivity" />
<activity android:name=".ShareActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="twitter" android:scheme="lifetime"/>
</intent-filter>
</activity>
流程:
- 使用单击 MainActivity 上的 Share 按钮。
- 我们使用参数
intent(ShareActivity) 调用startActivity(intent)。 -
ShareActivity.onCreate()被调用,我们开始 Twitter oAuth 身份验证过程。 - 显示网络浏览器活动,用户输入他们的 Twitter 凭据。
- Twitter 然后显示重定向回应用程序页面。
- Twitter 回调 URL
myapp://twitter - Intent 过滤器被触发,导致 ShareActivity 的新活动实例被创建和显示。
- ShareActivity 然后将推文发送到 Twitter,推文成功发布到用户墙上。
- ShareActivity 然后调用
finish()
问题
在第 9 点之前一切正常。调用 finish() 不会返回到原始 MainActivity,它只是关闭 ShareActivity 并返回到显示“将您重定向回应用程序”页面的浏览器活动。
如果用户点击返回按钮,他们将通过所有 Twitter 身份验证页面返回,然后最终返回 MainActivity。
会发生什么
当推文发布并且我们完成了 ShareActivity 时,原始 MainActivity 应该返回到(处于原始状态)。
ShareLib 正在处理所有身份验证和发布步骤,我无法控制它如何创建新活动。
当我创建 ShareActivity 时,我尝试发送标志 FLAG_ACTIVITY_NEW_TASK 并认为它会创建一个新的活动堆栈,但我不知道如何关闭该堆栈中的所有活动并返回到 MainActivity。
任何帮助将不胜感激。
【问题讨论】:
标签: android android-activity oauth android-intent android-2.2-froyo