11
votes

Comment allumer des comptes sous la nouvelle API Google Drive Android

Mon flux d'autorisation dans la nouvelle API Google Drive Android est la suivante:

  1. Menu: Sélectionnez Compte
  2. Connect ();
  3. onconnectionfailed () résultat.startresolutionForresult () Invoque AccountSelectDialog / DriveAuthorisation
  4. Onconnected () Faites vos affaires

    fonctionne comme un charme. En répétant maintenant dans le but de changer de compte:

    1. Menu: Sélectionnez Compte
    2. Connect ();
    3. ONConnected ()

      Ici, je n'ai aucune chance d'accéder au car je n'ai jamais obtenu onconnectionfailed () avec "résultat" pour invoquer StartresolutionForresult () . Qu'est-ce que je manque ce temps?


0 commentaires

5 Réponses :


0
votes

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é.

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.

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.


4 commentaires

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 ?



6
votes

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>

  1. Obtenir le compte de 'OnActivityResult ()' LI>
  2. SET Compte dans 'SetAccountName ()' Li>
  3. Gardez votre courriel de votre compte actuel. Vous pouvez donc détecter un nouveau (si l'utilisateur doit décider de basculer) et réinitialiser le client de compte Google si nécessaire. li> ol>

    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));
      }
    }
    


0 commentaires

8
votes

Tout d'abord, ajoutez le plus.api: xxx

alors vous pouvez changer de compte comme ceci: xxx

Pour plus, voir < a href = "https://developers.google.com/+/mobile/androïd/sign-in" rel = "noreferrer"> ici .


2 commentaires

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 .



7
votes

Il suffit d'appeler

mgoogleapiclient.cleardefaultAndReconnect ();

regarder sur le Docs .

Ceci appellera le rachat onconnectionfailed La mise en page à choisir parmi les comptes Google disponibles: xxx


3 commentaires

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.



0
votes

Si vous utilisez Googleapiclient, appelez simplement mgoogleapiclient.cleardefaultAndReconnect () code>.

Si vous utilisez DriveClient avec GooglesigninAccount (Lecteur de la bibliothèque 16.0.0), essayez ceci. P>

// 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")
        }
    }


0 commentaires