Как включить учетные записи в новом API Android для Google Диска

Мой поток авторизации в новом Android-приложении Google Диска выглядит следующим образом:

  1. Меню: ВЫБРАТЬ АККАУНТ
  2. подключения ();
  3. OnConnectionFailed () result.startResolutionForResult () вызывает AccountSelectDialog / DriveAuthorization
  4. OnConnected () делать ваши вещи

Работает как шарм. Теперь повторяя с целью переключения учетных записей:

  1. Меню: ВЫБРАТЬ АККАУНТ
  2. подключения ();
  3. onConnected ()

Здесь у меня нет шансов попасть в AccountSelectDialog, так как я никогда не получаю onConnectionFailed () с «результатом», чтобы вызвать startResolutionForResult () . Что я пропущу на этот раз?

Solutions Collecting From Web of "Как включить учетные записи в новом API Android для Google Диска"

Просто позвони

mGoogleApiClient.clearDefaultAccountAndReconnect();

Взгляните на документы .

Это вызовет onConnectionFailed вызов onConnectionFailed который будет onConnectionFailed макет для выбора среди доступных учетных записей Google:

 @Override public void onConnectionFailed(ConnectionResult connectionResult) { if (connectionResult.hasResolution()) { try { connectionResult.startResolutionForResult(this, RESOLVE_CONNECTION_REQUEST_CODE); } catch (IntentSender.SendIntentException e) { // Unable to resolve, message user appropriately } } else { GooglePlayServicesUtil.getErrorDialog(connectionResult.getErrorCode(), this, 0).show(); } } 

Во-первых, добавьте Plus.API:

 mGoogleApiClient = new GoogleApiClient.Builder(this).addApi(Drive.API).addApi(Plus.API).addScope(Drive.SCOPE_APPFOLDER).addConnectionCallbacks(this).addOnConnectionFailedListener(this).build(); 

Затем вы можете переключать такие аккаунты:

 public void onClick(View view) { if (view.getId() == R.id.sign_out_button) { if (mGoogleApiClient.isConnected()) { Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); mGoogleApiClient.disconnect(); mGoogleApiClient.connect(); } } } 

Подробнее см. Здесь .

Я понимаю, что я сделал довольно беспорядок, открыв два SO-вопроса по существу той же теме. Итак, самое подходящее время для консолидации ответов. Я искал прямые методы getter / setter в GDAA, но нашел только «setter» – setAccountName ()) – SO вопрос 21583828 (на самом деле этого не делал, но Burcu мне помог).

С другой стороны, «getter» можно заменить, получив имя учетной записи от «onActivityResult ()» – вопрос SO 21501829

И еще один вопрос SO – этот – по той же теме был разрешен.

Итак, вывод:

  1. Получить учетную запись от 'onActivityResult ()'
  2. Установить учетную запись в 'setAccountName ()'
  3. Держите свою электронную почту в текущем аккаунте, поэтому вы можете обнаружить новую (если пользователь решит переключиться) и сбросить клиент аккаунта Google, если это необходимо.

ОБНОВЛЕНИЕ 2014-11-04:

Вот оболочка, которую я использую для сохранения и управления учетными записями Google в своем приложении.

 import android.accounts.Account; import android.accounts.AccountManager; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.google.android.gms.auth.GoogleAuthUtil; public class GooAccMgr { private static final String ACC_NAME = "account_name"; public static final int FAIL = -1; public static final int UNCHANGED = 0; public static final int CHANGED = +1; private String mCurrEmail = null; // cache locally public Account[] getAllAccnts(Context ctx) { return AccountManager.get(acx(ctx)).getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE); } public Account getPrimaryAccnt(Context ctx) { Account[] accts = getAllAccnts(ctx); return accts == null || accts.length == 0 ? null : accts[0]; } public Account getActiveAccnt(Context ctx) { return email2Accnt(ctx, getActiveEmail(ctx)); } public String getActiveEmail(Context ctx) { if (mCurrEmail != null) { return mCurrEmail; } mCurrEmail = ctx == null ? null : pfs(ctx).getString(ACC_NAME, null); return mCurrEmail; } public Account email2Accnt(Context ctx, String emil) { if (emil != null) { Account[] accounts = AccountManager.get(acx(ctx)).getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE); for (Account account : accounts) { if (emil.equalsIgnoreCase(account.name)) { return account; } } } return null; } /** * Stores a new email in persistent app storage, reporting result * @param ctx activity context * @param newEmail new email, optionally null * @return FAIL, CHANGED or UNCHANGED (based on the following table) * OLD NEW SAVED RESULT * ERROR FAIL * null null null FAIL * null new new CHANGED * old null old UNCHANGED * old != new new CHANGED * old == new new UNCHANGED */ public int setEmail(Context ctx, String newEmail) { int result = FAIL; // 0 0 String prevEmail = getActiveEmail(ctx); if ((prevEmail == null) && (newEmail != null)) { result = CHANGED; } else if ((prevEmail != null) && (newEmail == null)) { result = UNCHANGED; } else if ((prevEmail != null) && (newEmail != null)) { result = prevEmail.equalsIgnoreCase(newEmail) ? UNCHANGED : CHANGED; } if (result == CHANGED) { mCurrEmail = newEmail; pfs(ctx).edit().putString(ACC_NAME, newEmail).apply(); } return result; } private Context acx(Context ctx) { return ctx == null ? null : ctx.getApplicationContext(); } private SharedPreferences pfs(Context ctx) { return ctx == null ? null : PreferenceManager.getDefaultSharedPreferences(acx(ctx)); } } 

Hat-tip для Алекс Локвуд для первоначального вдохновения. К сожалению, я не могу найти ссылку на его оригинальный код.

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

Если вы хотите предоставить возможности переключения аккаунта в своем приложении, вам нужно вместо этого запустить сборщик учетных записей из собственного приложения и указать имя учетной записи, выбранную при создании экземпляра GoogleApiClient.

Вы можете сохранить последнее выбранное имя учетной записи в общих настройках, чтобы вы помнили его до следующего раза, когда пользователь переключит учетные записи.