Как аутентифицировать несколько учетных записей в Android Dropbox sdk 1.5.1?

Мне нужно аутентифицировать несколько учетных записей

Я искал форум, и кажется, что это возможно. Так что я дал ему попробовать, но я потерпел неудачу

Я пробовал использовать тот же API APP_KEY & APP_SECRET, он провалился. Оба моего сеанса возвращают одну и ту же пару токенов доступа

Поэтому я пытаюсь использовать разные API APP_KEY & APP_SECRET, в той же учетной записи Dropbox, это тоже не сработало

Поэтому я снова пытаюсь использовать различные API APP_KEY & APP_SECRET из разных учетных записей Dropbox, он по-прежнему не работает

Кто-нибудь может предоставить мне решение? заранее спасибо

Ниже мой код, в основном, из примера 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); } } 

ДРУГИЕ КОДЫ

 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> 

Solutions Collecting From Web of "Как аутентифицировать несколько учетных записей в Android Dropbox sdk 1.5.1?"

Я не уверен, поможет ли это вам немного в вашем случае использования, но может быть обходным путем, чтобы написать собственный аутентификатор, чтобы использовать управление учетными записями Android для разделения процессов аутентификации. Вот пример: http://udinic.wordpress.com/2013/04/24/write-your-own-android-authenticator/

Я столкнулся с аналогичным требованием, и так я работал.

Первое приложение
Получите доступ к первому приложению, используя обычный поток Dropbox.

Примечание. Вероятным случаем для 2 требований к приложениям с Dropbox может быть доступ к учетной записи пользователя с вашего сервера с использованием другого приложения с Dropbox. Обратите внимание, что вы можете совместно использовать маркеры доступа из 1-го приложения на своем сервере и безопасно использовать эти учетные данные при условии, что вы используете одно и то же приложение на сервере. Если вы не можете с этим жить, продолжайте читать.

Второе приложение
Вариант 1. Использование другого приложения для Android.

  1. Создайте еще одно приложение для Android только для потока oAuth для 2-го приложения Dropbox.
  2. Используйте Intent для запуска oAuthflow в app2 из приложения 1.
  3. Опять же, используйте намерение отправить обратно данные токена из app2 в app1

Несколько советов, если вы собираетесь использовать это:

  1. Сделать фоновый вид активности AppA oAuth прозрачным
  2. Удалить анимацию изменения намерений для приложений 1 <-> переход app2
  3. Триггер oAuth в приложении App2

Вариант 2: Если вы продолжаете делать это только с одним Android-приложением, я нашел возможное обходное решение, как описано ниже.

  1. Попросите пользователя открыть этот URL-адрес: 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 из ключей авторизации посмотрите

API Dropbox имеет некоторые проблемы или вы можете сказать, что вам нужно использовать трюк, чтобы сделать несколько логинов.

1. Объявить sAuthenticatedUid как String []

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

2. Запустите OAuth, используя другой метод

Используйте session.startOAuth2Authentication(act, "", sAuthenticatedUid) для аутентификации вместо startOAuth2Authentication ()

3. Ведение переменных при проверке подлинности.

 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, который сохраняет результат последней проверки подлинности и может создавать проблемы, поскольку это статическая переменная.

Вы должны иметь возможность делать столько логинов, сколько хотите.