2012-11-20 27 views
9

我需要多个帐户如何在Android Dropbox sdk 1.5.1中验证多个帐户?

我已经搜索论坛

认证,而且好像有可能 所以我给它一个尝试,但我失败了

使用相同的API APP_KEY & APP_SECRET我试过,它未能 我的两个会议返回相同的访问令牌对

所以我尝试使用不同的API APP_KEY & APP_SECRET,在相同的Dropbox帐户,它没有太多

所以我再次尝试使用不同的API APP_KEY &来自不同Dropbox帐户的APP_SECRET,它仍然失败

任何人都可以为我提供解决方案吗?在此先感谢

下面是我的代码,主要来自DBroulette例如

的onCreate(机器人)

AndroidAuthSession session = buildSession(); 
mApi = new DropboxAPI<AndroidAuthSession>(session); 
AndroidAuthSession session2 = buildSession2(); 
mApi2 = new DropboxAPI<AndroidAuthSession>(session2); 

的onResume(机器人)

AndroidAuthSession session = mApi.getSession(); 
if (session.isLinked()) { 
dbsetLoggedIn(true); 
} else { 
dbsetLoggedIn(false); 
} 
if (session.authenticationSuccessful()) { 
try { 
session.finishAuthentication(); 
TokenPair tokens = session.getAccessTokenPair(); 
dbstoreKeys(tokens.key, tokens.secret); 
dbsetLoggedIn(true); 
statusTv.append("Dropbox authentication successful\n"); 
} catch (IllegalStateException e) { 
Log.i("Dropbox Error", "Error authenticating", e); 
} 
} 

AndroidAuthSession session2 = mApi2.getSession(); 
if (session2.isLinked()) { 
dbsetLoggedIn2(true); 
} else { 
dbsetLoggedIn2(false); 
} 
if (session2.authenticationSuccessful()) { 
try { 
session2.finishAuthentication(); 
TokenPair tokens = session2.getAccessTokenPair(); 
dbstoreKeys2(tokens.key, tokens.secret); 
dbsetLoggedIn2(true); 
statusTv.append("2Dropbox authentication successful\n"); 
} catch (IllegalStateException e) { 
Log.i("Dropbox Error", "Error authenticating", e); 
} 
} 

OTHERS码

private AndroidAuthSession buildSession() { 
AppKeyPair appKeyPair = new AppKeyPair(Constants.APP_KEY, Constants.APP_SECRET); 
AndroidAuthSession session; 
String[] stored = getKeys(); 
if (stored != null) { 
AccessTokenPair accessToken = new AccessTokenPair(stored[0], stored[1]); 
session = new AndroidAuthSession(appKeyPair, Constants.ACCESS_TYPE, accessToken); 
} else { 
session = new AndroidAuthSession(appKeyPair, Constants.ACCESS_TYPE); 
} 
return session; 
} 

private AndroidAuthSession buildSession2() { 
AppKeyPair appKeyPair = new AppKeyPair(Constants.APP_KEY2, Constants.APP_SECRET2); 
AndroidAuthSession session; 
String[] stored = getKeys2(); 
if (stored != null) { 
AccessTokenPair accessToken = new AccessTokenPair(stored[0], stored[1]); 
session = new AndroidAuthSession(appKeyPair, Constants.ACCESS_TYPE, accessToken); 
} else { 
session = new AndroidAuthSession(appKeyPair, Constants.ACCESS_TYPE); 
} 
return session; 
} 

private String[] getKeys() { 
SharedPreferences prefs = getSharedPreferences(Constants.ACCOUNT_PREFS_NAME, 0); 
String key = prefs.getString(Constants.ACCESS_KEY_NAME, null); 
String secret = prefs.getString(Constants.ACCESS_SECRET_NAME, null); 
if (key != null && secret != null) { 
String[] ret = new String[2]; 
ret[0] = key; 
ret[1] = secret; 
return ret; 
} else { 
return null; 
} 
} 

private String[] getKeys2() { 
SharedPreferences prefs = getSharedPreferences(Constants.ACCOUNT_PREFS_NAME, 0); 
String key = prefs.getString(Constants.ACCESS_KEY_NAME2, null); 
String secret = prefs.getString(Constants.ACCESS_SECRET_NAME2, null); 
if (key != null && secret != null) { 
String[] ret = new String[2]; 
ret[0] = key; 
ret[1] = secret; 
return ret; 
} else { 
return null; 
} 
} 

我注意到我可能需要添加一些东西到清单中,加入另一个 但是我不能在Android清单中添加不同的APP KEY中的第二个活动,因为它会导致重复的错误 我该怎么做?

<activity 
android:name="com.dropbox.client2.android.AuthActivity" 
android:configChanges="orientation|keyboard" 
android:launchMode="singleTask" > 
<intent-filter> 
<data android:scheme="db-XXXXXXXXXXXX" /> 

<action android:name="android.intent.action.VIEW" /> 

<category android:name="android.intent.category.BROWSABLE" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 
+0

仍在寻求帮助 – tcboy88

+0

你做了这项工作吗? – tipycalFlow

回答

1

我遇到了类似的需求,这就是我的工作方式。

1st App
使用正常的保管箱流访问您的第一个应用程序。

注意: 对于2个dropbox应用程序要求的可能情况可能是使用不同的Dropbox应用程序从您的服务器访问用户帐户。请注意,如果您在服务器上使用相同的Dropbox应用程序,则可以与第一个应用程序共享您的服务器的访问令牌并安全地重用这些凭据。如果你不能忍受,继续阅读。

第二应用
选项1:使用其他Android应用

  1. 只是为第二Dropbox的应用程序的OAuth的流程创建另一个Android应用程序。
  2. 使用Intent从app1触发app2中的oAuthflow。
  3. 同样,使用意图从APP 2发回的令牌数据APP1

的一些技巧,如果你要使用这样的:

  1. 让应用2 OAuth的活动透明
  2. 的背景
  3. 对APP <删除意图改变动画 - > APP 2过渡
  4. 触发的OAuth的应用2活动的onCreate

选项2:如果您一直只使用一个Android应用程序执行此操作,我发现了一种可能的解决方法,如下所述。

  1. 提示用户打开这个网址: https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=APP2_CLIENT_ID
  2. 他们将不得不复制回来的Dropbox
  3. 该授权码返回授权码可用于获取access_tokens的第二应用

如果您打算在服务器端上下文中使用第二个应用程序,只需与服务器共享授权码。您可以从授权代码标记,在python的流程,就像这样:

flow = client.DropboxOAuth2FlowNoRedirect(app2_key, app2_secret) 
authorize_url = flow.start() 
access_token, user_id = flow.finish(auth_code_from_client) 

对于更通用的方式来获得授权密钥access_tokens,look at this

0

的Dropbox API是有一些问题,或者你可以说一你需要使用的技巧才能进行多次登录。

1.声明sAuthenticatedUid作为字符串[]

private static final String[] sAuthenticatedUid = { "dummy"}; // Keeping only one Auth Id to keep last authenticated item

2.启动的OAuth使用不同的方法

使用session.startOAuth2Authentication(act, "", sAuthenticatedUid)进行认证,而不是startOAuth2Authentication()

3.保持变量的正确性ntication成功

sAuthenticatedUid[0] = sessionApi.getSession().finishAuthentication(); // Save the last successful UID 
String oauth2AccessToken = sessionApi.getSession().getOAuth2AccessToken(); 
AuthActivity.result = null; // Reset this so that we can login again, call only after finishAuthentication() 

AuthActivity是com.dropbox.client2.android.AuthActivity存储从最后验证的结果,因为这是静态变量可能产生问题。

您应该可以根据需要进行多次登录。