Mon flux d'autorisation dans la nouvelle API Google Drive Android est la suivante: P>
fonctionne comme un charme. En répétant maintenant dans le but de changer de compte: p>
Ici, je n'ai aucune chance d'accéder au em> car je n'ai jamais obtenu onconnectionfailed () em> avec "résultat" pour invoquer StartresolutionForresult () EM >. Qu'est-ce que je manque ce temps? P>
5 Réponses :
On dirait que vous comptez sur la sélection de compte par défaut. Dans cette configuration, l'utilisateur est invitée une fois pour sélectionner un compte et ce statut est rappelé. P>
Si vous souhaitez fournir des fonctionnalités de commutation de compte dans votre application, vous devez lancer la liste du compte de compte à partir de votre propre application et fournir le nom du compte sélectionné lorsque vous instaniez le Googleapiclient. P>
Vous pouvez persister le dernier nom de compte sélectionné dans les préférences partagées afin de vous en souvenir de la prochaine fois que l'utilisateur interdit les comptes. P>
Merci pour votre réponse. Malheureusement, ce n'est pas ce que je suis après. Ma question était liée à la portion à la nouvelle API Google Drive Android (GDAA) développeurs.google.com/drive/ Android de lecteur SDK V2 (SDKV2). Dans SDKV2, je peux commencer le sélecteur de compte "StartActivityForresult (NewchooseAcCompounTentent (), ...)". Dans GDAA, je dois le faire comme vous l'avez mentionné, conduisant à un code compliqué avec la redondance. La question n'était donc pas "comment se déplacer" mais "Y a-t-il quelque chose qui me manque" dans GDAA. Désolé de ne pas être plus précis la première fois.
Dans GDAA, si vous ne fournissez pas de nom de compte, il utilise la sélection de compte par défaut. Si aucun compte par défaut n'a encore été sélectionné, l'utilisateur sera invité à en choisir un. Après cette heure, ce compte par défaut sera toujours utilisé. Il n'y a pas de moyen de réinitialiser cela. Si vous souhaitez prendre en charge des comptes multiples et la commutation entre eux, vous devez effectuer la sélection de la sélection de compte vous-même.
Merci Cheryl, j'ai ajouté une autre réponse ci-dessous, juste pour nettoyer le désordre que j'ai fait.
Bonjour Cheryl, je veux utiliser un compte qui n'existe pas sur un périphérique comme un compte tiers. Est-ce possible ?
Je me rends compte que j'ai fait un désordre en ouvrant deux questions de deux questions sur le même sujet. Donc, c'est un bon moment pour consolider les réponses. Je cherchais des méthodes de getter / setter direct dans gdaa mais je n'ai trouvé que le 'Setter' - SetAccountName ()) - Donc, question 21583828 (en fait, mais Burcu m'a aidé).
de l'autre côté, 'getter' peut être substitué en obtenant le nom du compte de "OnactivyResult ()" - Question 21501829 P>
Et encore une autre question - celle-ci - sur le même sujet a également été résolue.
la conclusion est la suivante: p>
update 2014-11-04: strong> p> Voici une enveloppe que j'utilise pour persister et gérer les comptes Google dans mon application. P> 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));
}
}
Tout d'abord, ajoutez le plus.api: alors vous pouvez changer de compte comme ceci: p> Pour plus, voir < a href = "https://developers.google.com/+/mobile/androïd/sign-in" rel = "noreferrer"> ici . p> p>
Je dois ajouter, je ne sais pas pourquoi cela fonctionne - ne devrait-il pas simplement changer le compte plus? - Mais cela ressemble à cela ... J'apprécierais que quelqu'un d'autre confirme.
Cela a également travaillé pour moi. Je me demande si cela nettoie les comptes de Google Lecteur uniquement parce que vous passez dans mgoogleapiclient code>.
Il suffit d'appeler
regarder sur le Docs . P> Ceci appellera le rachat code> onconnectionfailed code> La mise en page à choisir parmi les comptes Google disponibles: p> mgoogleapiclient.cleardefaultAndReconnect (); code> p>
Merci, cela fonctionne, mais mon application doit toujours connaître le compte actif (courrier électronique) sélectionné dans le processus. Le gérer sur le niveau d'application (par ma réponse ci-dessous) est 1 / désordonné, 2 / Besoins 'Get_Prappants permission. Des idées? BTW, la méthode que vous mentionnez n'existait pas quand j'ai posé la question.
Maintenant, 16-05-26. Il suffit d'appeler . mgoogleapiclient.cleardefaultAccounterNtandReconnect (); / "ClearDefaultAccounterReconnect" est obsolète.
@BrownSoohan Où voyez-vous cela? Il n'y a aucune indication dans le code ou dans les documents.
Si vous utilisez Googleapiclient, appelez simplement Si vous utilisez DriveClient avec GooglesigninAccount (Lecteur de la bibliothèque 16.0.0), essayez ceci. P> mgoogleapiclient.cleardefaultAndReconnect () code>.
// try connect Drive
fun startSignIn() {
val requiredScopes = HashSet<Scope>()
requiredScopes.add(Drive.SCOPE_FILE)
requiredScopes.add(Drive.SCOPE_APPFOLDER)
val account = GoogleSignIn.getLastSignedInAccount(this)
if (account != null && account.grantedScopes.containsAll(requiredScopes)) {
// TODO: Get DriveClient and DriveResourceClient
} else {
val option = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(Drive.SCOPE_FILE, Drive.SCOPE_APPFOLDER)
.build()
val client = GoogleSignIn.getClient(this, option)
startActivityForResult(client.signInIntent, REQUEST_CODE_SIGN_IN)
}
}
// try change account
fun changeAccount() {
val option = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.build()
val client = GoogleSignIn.getClient(activity, option)
client.signOut()
.addOnSuccessListener {
Log.d(TAG, "signOut success")
// Try again sign-in
startSignIn()
}
.addOnFailureListener {
Log.e(TAG, "signOut failed $it")
}
}