¿Cómo autenticar varias cuentas en Android dropbox sdk 1.5.1?

Necesito autenticar varias cuentas

He buscado en el foro, y parece que es posible Así que lo intenté, pero fallé

He intentado usar la misma API APP_KEY & APP_SECRET, falló Tanto mi sesión devolver el mismo par de tokens de acceso

Así que intento usar diferentes API APP_KEY & APP_SECRET, en la misma cuenta de Dropbox, falló demasiado

Así que intento nuevamente usar APP_KEY y APP_SECRET de diferentes API de diferentes cuentas de Dropbox, todavía falló

¿Alguien puede proporcionarme una solución? Gracias por adelantado

A continuación se muestra mi código, procede principalmente del ejemplo DBroulette

OnCreate (android)

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

OnResume (android)

 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); } } 

CÓDIGOS DE OTROS

 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; } } 

Me di cuenta de que tal vez tenga que añadir algo en el manifiesto en la adición de otro, pero no puedo añadir la segunda actividad en android manifiesto con diferentes APP KEY, ya que causará errores duplicados ¿Cómo puedo hacerlo?

 <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> 

No estoy seguro de si esto le ayudaría un poco en su caso de uso, pero tal vez podría ser una solución para escribir su propio autenticador para utilizar la gestión de cuentas de Android build-in para separar los procesos de autenticación. Aquí hay un ejemplo: http://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/

Me encontré con un requisito similar y así es como trabajé alrededor.

1ª aplicación
Obtenga acceso para su primera aplicación utilizando el flujo normal de Dropbox.

Nota: Un caso probable para el requisito de 2 aplicaciones de Dropbox podría estar accediendo a la cuenta de usuario desde su servidor usando una aplicación dropbox diferente. Tenga en cuenta que puede compartir los tokens de acceso desde la primera aplicación con su servidor y reutilizar estas credenciales de forma segura, siempre y cuando esté utilizando la misma aplicación de Dropbox en el servidor. Si no puedes vivir con eso, sigue leyendo.

Segunda aplicación
Opción 1: Uso de otra aplicación para Android

  1. Cree otra aplicación de Android solo para el flujo de oAuth para la segunda aplicación de Dropbox.
  2. Use Intent para activar oAuthflow en app2 desde app1.
  3. Una vez más, utilice la intención de enviar datos de token de app2 a app1

Algunos consejos, si usted va a utilizar esto:

  1. Hacer transparente el fondo de App2 oAuth Actividad
  2. Eliminar animaciones de cambio de intención para app1 <-> transiciones de app2
  3. Activar oAuth en la actividad de App2 onCreate

Opción 2: si sigues haciendo esto con solo una aplicación de Android, encontré una posible solución como se describe a continuación.

  1. Solicite al usuario que abra esta url: https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=APP2_CLIENT_ID
  2. Tendrán que copiar un código de autorización devuelto por Dropbox
  3. Este código de autorización se puede utilizar para obtener access_tokens para la segunda aplicación

Si va a usar la segunda aplicación en un contexto de servidor, simplemente comparta el código de autorización con su servidor. Puede obtener fichas de código de autorización, en un flujo de python, como esto:

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

Para obtener más formas genéricas de obtener access_tokens de las claves de autorización, mire esto

Dropbox API tiene algunos problemas o puedes decir un truco que necesitas usar para realizar varios inicios de sesión.

1. Declare sAuthenticatedUid como String []

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

2. Inicie OAuth utilizando otro método

Utilice session.startOAuth2Authentication(act, "", sAuthenticatedUid) para la autenticación en lugar de startOAuth2Authentication ()

3. Mantener las variables en la autenticación

 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 es com.dropbox.client2.android.AuthActivity que almacena el resultado de la última autenticación y puede crear problemas ya que esta es una variable estática.

Deberías poder hacer tantos inicios de sesión como quieras ahora.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.