2014-02-06 2 views
9

Мой поток авторизации в новом API Google Drive Android выглядит следующим образом:Как переключаться между аккаунтами под API NEW Google Drive Android

  1. Меню: SELECT СЧЕТ
  2. подключения();
  3. onConnectionFailed() result.startResolutionForResult() вызывает AccountSelectDialog/DriveAuthorization
  4. onConnected() сделать ваши вещи

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

  1. меню: ВЫБРАТЬ СЧЕТ
  2. подключения();
  3. onConnected()

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

ответ

7

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

mGoogleApiClient.clearDefaultAccountAndReconnect();

взглянуть на docs.

Это будет вызывать 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(); 
    } 

} 
+1

Спасибо, что работает, но моему приложению все еще нужно знать активную учетную запись (адрес электронной почты), которую пользователь выбрал в процессе. Управление им на уровне приложения (по моему ответу ниже) 1/messy, 2/требует разрешения GET_ACCOUNTS. Есть идеи? Кстати, метод, который вы упомянули, не существовал, когда я задавал вопрос. – seanpj

+0

Теперь, 16-05-26. Просто позвони . mGoogleApiClient.clearDefaultAccountAndReconnect();/"clearDefaultAccountAndReconnect" устарел. –

+0

@BrownsooHan Где вы это видите? В коде или документах нет указаний. – Bevor

0

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

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

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

+0

Спасибо за ваш ответ. К сожалению, это не то, что мне нужно. Мой вопрос был связан с переносом на Android-приложение Android Android (GDAA) https://developers.google.com/drive/android из Drive SDK v2 (SDKV2). В SDKV2 я могу запустить сборщик учетных записей «startActivityForResult (newChooseAccountIntent(), ...)». В GDAA я должен сделать это так, как вы упомянули, что приводит к свернутому коду с избыточностью. Таким образом, вопрос не был «как обойти», но «есть что-то, что мне не хватает» в GDAA. Извините за то, что не был более конкретным в первый раз. – seanpj

+2

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

+0

Спасибо, Шерил, я добавил еще один ответ ниже, просто чтобы очистить беспорядок, который я сделал. – seanpj

6

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

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

И еще один так вопрос - это одно - по той же теме была решена, а также ,

Поэтому вывод:

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

UPDATE 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 для Alex Lockwood для первоначального вдохновения. К сожалению, я не могу найти ссылку на его оригинальный код.

8

Во-первых, добавьте 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(); 
    } 
    } 
} 

Более подробно см here.

+0

Я должен добавить, я не знаю, почему это работает - не стоит ли просто менять учетную запись Plus? - но похоже, что это так ... Почувствовал бы, что кто-то еще подтвердит. –

+0

Это сработало и для меня. Мне интересно, очищает ли учетные записи для Google Диска только потому, что вы переходите в 'mGoogleApiClient'. – Randy