web-dev-qa-db-fra.com

onConnectionFailed qui donne SIGN_IN_REQUIRED (4)

Je développe une application Android sur laquelle je souhaite utiliser l'API Google. Pour cela, j'ai importé le projet google-play-service-lib.

Je suis ce link pour initialiser l’objet GoogleApiClient.

Mon code:

1) Dans la méthode onCreate(), je construis l'objet GoogleApiClient:

mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .addApi(Plus.API, null)
    .addScope(Plus.SCOPE_PLUS_LOGIN)
    .build();

2) Dans onStart(), j'appelle mGoogleApiClient.connect().

3) Mon activité implémente ConnectionCallbacks et OnConnectionFailedListener.

4) Ma méthode onConnectionFailed() ressemble à:

public void onConnectionFailed(ConnectionResult result) {
    //in dubug result looks like : ConnectionResult{
    //statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent
                    // {41f8ca70: Android.os.BinderProxy@41f8ca10}}
     try {
     if(!mIntentInProgress && result.hasResolution())
     {
         mIntentInProgress=true;
        result.startResolutionForResult(mActivity, RC_SIGN_IN);
          }

    } catch (SendIntentException e) {
        e.printStackTrace();
    }
}

5) Ma méthode onActivityResult() contient:

if (requestCode == RC_SIGN_IN) {
   if (!mGoogleApiClient.isConnecting()) {
      mGoogleApiClient.connect();
   }
}

Lorsque je lance mon application, je reçois un Toast qui indique qu'une erreur interne est apparue. J'ai créé le projet dans la console Google.

21
DCoder

J'ai eu le même problème.

Dans la documentation: Le client peut choisir de continuer sans utiliser l'API ou appeler startResolutionForResult (Activity, int) pour demander à l'utilisateur de se connecter.

Donc, vous devriez essayer de vous connecter en utilisant la fonction startResolutionForResult ()

@Override
public void onConnectionFailed(ConnectionResult result) {
   if (result.hasResolution()) {
       try {
           // !!!
           result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
       } catch (SendIntentException e) {
           mPlusClient.connect();
       }
   }

   mConnectionResult = result;
}
23
user2642219

Il suffit de suivre les instructions de Google 

ET PRUDENCE

Puisque vous êtes toujours en mode de développement, vérifiez si vous avez ajouté votre adresse e-mail de test au centre GAME DETAILS avant de publier le jeu.

7
Naskov

Vérifiez que vous signez l'application avec un fichier de clés qui se trouve dans l'apk et chargé sur la console du développeur de Google Play (si vous testez, vous pouvez télécharger en tant que fichier alpha et publier tout en le gardant privé).

Sinon, cela pourrait être autre chose. Assurez-vous que l'adresse électronique de votre compte est répertoriée dans les testeurs de la page Détails du compte (dans le menu des paramètres avec une icône représentant une roue dentée), et que la réponse sous licence est définie sur LICENSED, PAS sur RESPOND_NORMALLY.

6
Michael Chinen

Pas sûr que ce soit la meilleure réponse, mais cela a fonctionné pour moi. J'ai copié onConnectionFailed () à partir de BasicSamples TakeANumber MainActivity. Il appelle BaseGameUtils à résoudre. Bien sûr, cela implique que vous ayez la bibliothèque BaseGameUtils incluse dans votre projet, ce qui est une autre possibilité. Mais peut-être que vous pouvez vous en tirer avec la seule méthode, alors je l'ai copiée ci-dessous.

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
   logger.info( "onConnectionFailed() *play* : attempting to resolve");
    if (mResolvingConnectionFailure) {
       logger.info( "onConnectionFailed(): already resolving");
        return;
    }

    if (mSignInClicked || mAutoStartSignInFlow) {
        mAutoStartSignInFlow = false;
        mSignInClicked = false;
        mResolvingConnectionFailure = true;
        if (!BaseGameUtils.resolveConnectionFailure(this, mGoogleApiClient, connectionResult,
                RC_SIGN_IN, getString(R.string.signin_other_error))) {
            mResolvingConnectionFailure = false;
        }
    }
}

De Google BasicSamples BaseGameUtils.Java:

 public static boolean resolveConnectionFailure(Activity activity,
                                               GoogleApiClient client, ConnectionResult result, int requestCode,
                                               String fallbackErrorMessage) {

    if (result.hasResolution()) {
        try {
            result.startResolutionForResult(activity, requestCode);
            return true;
        } catch (IntentSender.SendIntentException e) {
            // The intent was canceled before it was sent.  Return to the default
            // state and attempt to connect to get an updated ConnectionResult.
            client.connect();
            return false;
        }
    } else {
        // not resolvable... so show an error message
        int errorCode = result.getErrorCode();
        Dialog dialog = GooglePlayServicesUtil.getErrorDialog(errorCode,
                activity, requestCode);
        if (dialog != null) {
            dialog.show();
        } else {
            // no built-in dialog: show the fallback error message
            showAlert(activity, fallbackErrorMessage);
        }
        return false;
    }
}
3
user6627139

L'API de lecteur doit être activée à partir de la page de la console.

3
challenger

Cette erreur indique que l'utilisateur doit autoriser votre application. Il existe un flux de travail complet pour cela, à la suite du didacticiel de https://developers.google.com/+/mobile/Android/getting-started recherchez "onConnectionFailed".

3
Hounshell

si vous n'utilisez pas les clés de débogage, appuyez sur l'application pour google jouer en alpha, ajoutez-vous en tant que testeur et le plus important - suivez le lien "Opt-in" sur la page Aplha et CONFIRMEZ que vous êtes le testeur.

2
Max

J'ai eu le même problème et résolu avec cette solution, En fait, j'avais une très ancienne version de la bibliothèque de services de jeu de Google, aussi je l'ai mise à jour avec la dernière bibliothèque de services de jeu de Google à compile 'com.google.Android.gms: play -services: 11.0.4 ' de ma bibliothèque de versions précédentes pour prendre en charge votre SDK Android et gérer les options compileSDKVersion et targetSDKVersion dans gradle: app. ajouter google drive activé API_KEY dans manifest.et réessayer 

1
Anjali

J'aimerais partager mon expérience avec cela. Mon cas était lors de l'utilisation des services Google Play pour Google Play Jeux. J'obtenais également l'erreur onConnectionFailed en donnant l'erreur SIGN_IN_REQUIRED. Enfin, je réalise que je n'avais pas "publié" mes paramètres de jeu dans la console du développeur. Ne soyez pas confondu avec la publication d'une version "alpha" ou "beta" de votre apk. Je veux dire le "jeu" des jeux Google Play que vous créez et établissez un lien vers l'APK du jeu.

1
Jonathan

pour ma cause, j'ai utilisé à tort la clé SHA1 pour générer l'API dans la console de développeur . Puis la clé SHA1 a été créée avec debug.keystore et mise à jour dans les informations d'identification de mon api. Sa commencé à travailler. 

keytool -list -v -keystore "C:\Users\<user>n\.Android\debug.keystore" -alias androiddebugkey -storepass andro
id -keypass Android
0
Anand saga