我正在尝试将Android 4+连接到Dropbox。我使用的是Dropbox提供的最新版Core API。
在我使用dropboxAPI.getSession().startOAuth2Authentication(activity)
对用户进行身份验证后,当用户返回我的应用时,尝试保存用户密钥和令牌,一切正常。
当用户在身份验证后返回我的应用程序时,以下代码应该保存密钥和令牌:
public boolean completeLogInAfterAuthentication() {
AndroidAuthSession session = dropboxAPI.getSession();
if (session.authenticationSuccessful()) {
try {
// Mandatory call to complete the auth
session.finishAuthentication();
// Store it locally in our app for later use
TokenPair tokens = session.getAccessTokenPair();
saveSessionKeys(tokens.key, tokens.secret);
return true;
} catch (IllegalStateExceptione) {
Log.d("MyLog", "Couldn't authenticate with Dropbox:" + e.getLocalizedMessage());
Log.d("MyLog", "Error authenticating", e);
}
}
return false;
}
这正是Dropbox提供的DBRoulett演示中使用的代码。 问题是,session.getAccessTokenPair()
返回null 。
因此我无法存储任何密钥或令牌,用户每次启动应用程序时都必须重新登录。我该如何解决这个问题?
我发现的所有信息都说getAccessTokenPair()
可能会因IllegalStateException
而失败,但事实并非如此。返回null的情况不会在任何地方描述。知道我能做什么吗?
答案 0 :(得分:3)
getAccessTokenPair
用于获取OAuth 1访问令牌(和机密)。但您使用的是OAuth 2,因此您需要getOAuth2AccessToken
。从教程(https://www.dropbox.com/developers/core/start/android):
protected void onResume() {
super.onResume();
if (mDBApi.getSession().authenticationSuccessful()) {
try {
// Required to complete auth, sets the access token on the session
mDBApi.getSession().finishAuthentication();
String accessToken = mDBApi.getSession().getOAuth2AccessToken();
} catch (IllegalStateException e) {
Log.i("DbAuthLog", "Error authenticating", e);
}
}
}
这与DBRoulette示例中的内容大致相同,但它包含OAuth 1和OAuth 2的代码:
private void storeAuth(AndroidAuthSession session) {
// Store the OAuth 2 access token, if there is one.
String oauth2AccessToken = session.getOAuth2AccessToken();
if (oauth2AccessToken != null) {
SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
Editor edit = prefs.edit();
edit.putString(ACCESS_KEY_NAME, "oauth2:");
edit.putString(ACCESS_SECRET_NAME, oauth2AccessToken);
edit.commit();
return;
}
// Store the OAuth 1 access token, if there is one. This is only necessary if
// you're still using OAuth 1.
AccessTokenPair oauth1AccessToken = session.getAccessTokenPair();
if (oauth1AccessToken != null) {
SharedPreferences prefs = getSharedPreferences(ACCOUNT_PREFS_NAME, 0);
Editor edit = prefs.edit();
edit.putString(ACCESS_KEY_NAME, oauth1AccessToken.key);
edit.putString(ACCESS_SECRET_NAME, oauth1AccessToken.secret);
edit.commit();
return;
}
}