sesion - ¿Cómo cambio las cuentas en la NUEVA API de Android de Google Drive?
google drive online (4)
Parece que confía en la selección de cuenta predeterminada. En esta configuración, se le solicita al usuario una vez que seleccione una cuenta, y este estado se recuerda.
Si desea proporcionar capacidades de cambio de cuenta en su aplicación, en lugar de eso, debe iniciar el selector de cuenta desde su propia aplicación y proporcionar el nombre de cuenta seleccionado cuando crea una instancia de GoogleApiClient.
Puede conservar el último nombre de cuenta seleccionado en las preferencias compartidas para que lo recuerde hasta la próxima vez que el usuario cambie de cuenta.
Mi flujo de autorización en la nueva API de Android de Google Drive es el siguiente:
- Menú: SELECCIONAR CUENTA
- conectar();
- onConnectionFailed () result.startResolutionForResult () invoca AccountSelectDialog / DriveAuthorization
- onConnected () haz tus cosas
Funciona de maravilla. Ahora repitiendo con el objetivo de cambiar cuentas:
- Menú: SELECCIONAR CUENTA
- conectar();
- onConnected ()
Aquí, no tengo posibilidad de acceder al AccountSelectDialog porque nunca me aparece onConnectionFailed () con ''result'' para invocar startResolutionForResult () . ¿Qué me estoy perdiendo esta vez?
Primero, agregue el Plus.API:
mGoogleApiClient = new GoogleApiClient.Builder(this).addApi(Drive.API).addApi(Plus.API).addScope(Drive.SCOPE_APPFOLDER).addConnectionCallbacks(this).addOnConnectionFailedListener(this).build();
Entonces puedes cambiar cuentas como esta:
public void onClick(View view) {
if (view.getId() == R.id.sign_out_button) {
if (mGoogleApiClient.isConnected()) {
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
}
}
}
Para más, mira aquí .
Solo llama
mGoogleApiClient.clearDefaultAccountAndReconnect();
eche un vistazo a los documentos .
Esto llamará a la onConnectionFailed
llamada onConnectionFailed
que presentará el diseño para elegir entre las cuentas de Google disponibles:
@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();
}
}
Me doy cuenta de que hice un gran lío al abrir dos preguntas SO sobre esencialmente el mismo tema. Entonces, es un buen momento para consolidar las respuestas. Estaba buscando métodos getter / setter directos en GDAA pero solo encontré el ''setter'' - setAccountName ()) - SO pregunta 21583828 (en realidad no, pero Burcu me ayudó).
Por otro lado, ''getter'' puede ser sustituido obteniendo el nombre de la cuenta de "onActivityResult ()" - SO cuestión 21501829
Y también se ha resuelto otra pregunta más, esta, sobre el mismo tema.
Entonces la conclusión es:
- obtener cuenta de ''onActivityResult ()''
- establecer la cuenta en ''setAccountName ()''
- mantenga actualizado el correo electrónico de su cuenta actual, para que pueda detectar uno nuevo (si el usuario decide cambiar) y restablecer el Cliente de cuenta de Google si es necesario.
ACTUALIZACIÓN 2014-11-04:
Aquí hay un contenedor que utilizo para mantener y administrar las cuentas de Google dentro de mi aplicación.
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));
}
}
Sombrero de punta a Alex Lockwood para la inspiración inicial. Desafortunadamente, no puedo encontrar referencia a su código original.