6
votes

Connexion Google pour Android: impossible de résoudre RC_SIGN_IN

J'essaie de m'authentifier auprès du serveur backend depuis l'application mobile. Je suivais cette documentation. https://developers.google.com/identity/sign-in/android / connexion Cependant, il y a quelques erreurs. RC_SIGN_IN et updateUI () ne peuvent pas être résolus.

Mon code est comme ceci

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<!-- Include the main content -->
<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.google.android.gms.common.SignInButton
        android:id="@+id/sign_in_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/text_view_result"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#000"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.v4.widget.NestedScrollView>

</FrameLayout>

<!-- Navigation bar -->
<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/navigation_menu"/>

</android.support.v4.widget.DrawerLayout>

Update h1 >

Le bouton lui-même ne fonctionne plus.

xml

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

    ...

       GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

       mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

        mSignInButton = findViewById(R.id.sign_in_button);
        mSignInButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "Hello", Toast.LENGTH_LONG).show();
            Intent signIntent = mGoogleSignInClient.getSignInIntent();
            startActivityForResult(signIntent, RC_SIGN_IN);
        }
    });


   @Override
   protected void onStart() {
        GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
        updateUI(account);
        super.onStart();
    }


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        // The Task returned from this call is always completed, no need to attach
        // a listener.
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        handleSignInResult(task);
    }
}


   private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
       try {
           GoogleSignInAccount account = completedTask.getResult(ApiException.class);
           String idToken = account.getIdToken();

           // Send Id Token to the backend and validate here

           // Signed in successfully, show authenticated UI.
           updateUI(account);
       } catch (ApiException e) {
           // The ApiException status code indicates the detailed failure reason.
           // Please refer to the GoogleSignInStatusCodes class reference for more information.
           Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
           updateUI(null);
       }
   }

Comment puis-je résoudre ce problème?


11 commentaires

Est le mSignInButton de type SignInButton


Oui, j'ai défini Private SignInButton mSignInButton;


Essayez de supprimer le boîtier du commutateur, j'ai mis à jour ma réponse.


Vérifiez-vous l'émulateur, si oui, vous devrez d'abord y ajouter un compte Google. Accédez à l'application Gmail et ajoutez-y un compte Google.


J'ai supprimé la déclaration switch et mon compte Google a déjà été ajouté sur mon émulateur mais ne fonctionne toujours pas.


Essayez de l'utiliser sur un vrai smartphone


Copie possible de Que signifie RC_SIGN_IN dans la connexion googleplus < / a>


vous n'utilisez peut-être pas d'image d'émulateur avec les services de lecture activés, ce qui est une condition préalable à cela.


@MartinZeitler Mon émulateur a activé les services de lecture. Ne fonctionne toujours pas même sur un appareil réel ...


@Wineseller, il peut y avoir un problème avec le plugin Play Services, ce qui pourrait empêcher l'analyse de google_services.json - alors il n'y a pas de clientId dans les ressources de la chaîne et ce bouton ne fonctionnera pas ... qui est l'autre condition préalable.


@ Vendeur de vin Vérifiez ma réponse, cela pourrait vous aider.


3 Réponses :


3
votes

-RC_SIGNIN est essentiellement un code numérique qui est utilisé pour identifier que votre onActivityResult est appelé pour la connexion google

private void updateUI(GoogleSignInAccount signedIn) {
  if (signedIn != null) {
      // sigin is successfull
      signInButton.setVisibility(View.GONE);
      signOutButton.setVisibility(View.VISIBLE);
  } else {
      // sigin is cancelled
      signInButton.setVisibility(View.VISIBLE);
      signOutButton.setVisibility(View.GONE);
  }

UpdateUi est une méthode utilisée pour informer l'utilisateur que la connexion google est réussie ou non. Voici la méthode:

 private static final int RC_SIGN_IN = 007;

}


1 commentaires

Merci, les erreurs ont été corrigées. Cependant, sign_in_button ne fonctionne pas. Rien ne se passe lorsque je clique dessus.



5
votes

Vous n'avez rien d'autre à faire que de remplacer RC_SIGN_IN par une valeur int. Cela peut être n'importe quoi mais utiliser 1 comme valeur. Procédez comme suit:

GoogleSignInAccount account = GoogleSignIn.g etLastSignedInAccount(this); //use this in onCreate

Et modifiez le code if dans le résultat de l'activité comme suit:

startActivity(new Intent(MainActivity.this, SecondActivity.class));

Modifiez également le code de clic du bouton de connexion en ceci (supprimer les cas de commutation):

mSignInButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
                      signIn();
               }
           }
       });

C'est parce que vous appelez la méthode click sur le bouton et vérifiez à nouveau Si le même bouton est cliqué, c'est pourquoi je pense que c'est ne fonctionne pas.

Maintenant, pour la méthode updateUI , cette méthode doit être définie par vous. Fondamentalement, il s'agit pour votre application de modifier ce qui est montré à l'utilisateur lorsqu'il / elle s'est connecté à l'application. Si vous souhaitez ouvrir une nouvelle activité lorsque signedIn () , vous pouvez utiliser Intent en modifiant updateUI (compte) dans le résultat de l'activité et l'événement au démarrage à un intent:

if (requestCode == 1)

Et obtenez quel compte est connecté dans SecondActivity:

startActivityForResult(signIntent, 1);

p>


5 commentaires

Merci de répondre. Cependant, sign_in_button ne fonctionne pas du tout. J'ai essayé de définir Toast dans OnClickListener mais cela ne s'affiche pas.


Obtenez-vous une référence de pointeur nul ou si l'application se bloque, pouvez-vous ajouter la trace de pile à la question?


Veuillez également ajouter où vous définissez l'identifiant du bouton et l'initialisez dans le code


L'application ne plante pas. Le bouton lui-même ne fonctionne tout simplement pas.


Quoi qu'il en soit, merci beaucoup pour votre patience. J'approuve votre réponse.



4
votes

Essayez celui-ci.

Dans MainActivity, implémentez View.OnClickListener et GoogleApiClient.OnConnectionFailedListener

private static final String TAG = MainActivity.class.getSimpleName();
private static final int RC_SIGN_IN = 007;
private GoogleApiClient mGoogleApiClient;

GoogleSignInOptions gso = new 
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

GoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this, this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();

btnSignIn.setSize(SignInButton.SIZE_STANDARD);
btnSignIn.setScopes(gso.getScopeArray());


private void handleSignInResult(GoogleSignInResult result) {
    Log.d(TAG, "handleSignInResult:" + result.isSuccess());
    if (result.isSuccess()) {
        // Signed in successfully, show authenticated UI.
        GoogleSignInAccount acct = result.getSignInAccount();

        Log.e(TAG, "display name: " + acct.getDisplayName());

        String personName = acct.getDisplayName();
        String personPhotoUrl = acct.getPhotoUrl().toString();
        String email = acct.getEmail();

        Log.e(TAG, "Name: " + personName + ", email: " + email
                + ", Image: " + personPhotoUrl);

        txtName.setText(personName);
        txtEmail.setText(email);
        Glide.with(getApplicationContext()).load(personPhotoUrl)
                .thumbnail(0.5f)
                .into(imgProfilePic);

        updateUI(true);
    } else {
        // Signed out, show unauthenticated UI.
        updateUI(false);
    }
}


private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
}

private void signOut() {
    Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
            new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    updateUI(false);
                }
            });
}


private void revokeAccess() {
    Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback(
            new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    updateUI(false);
                }
            });
}
@Override
public void onClick(View v) {
    int id = v.getId();

    switch (id) {
        case R.id.btn_sign_in:
            signIn();
            break;

        case R.id.btn_sign_out:
            signOut();
            break;

        case R.id.btn_revoke_access:
            revokeAccess();
            break;
    }

}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        handleSignInResult(result);
    }
}

@Override
public void onStart() {
    super.onStart();

    OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
    if (opr.isDone()) {
        // If the user's cached credentials are valid, the OptionalPendingResult will be "done"
        // and the GoogleSignInResult will be available instantly.
        Log.d(TAG, "Got cached sign-in");
        GoogleSignInResult result = opr.get();
        handleSignInResult(result);
    } else {
        // If the user has not previously signed in on this device or the sign-in has expired,
        // this asynchronous branch will attempt to sign in the user silently.  Cross-device
        // single sign-on will occur in this branch.
        showProgressDialog();
        opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
            @Override
            public void onResult(GoogleSignInResult googleSignInResult) {
                hideProgressDialog();
                handleSignInResult(googleSignInResult);
            }
        });
    }
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.d(TAG, "onConnectionFailed:" + connectionResult);
}

private void updateUI(boolean isSignedIn) {
    if (isSignedIn) {
        btnSignIn.setVisibility(View.GONE);
        btnSignOut.setVisibility(View.VISIBLE);
        btnRevokeAccess.setVisibility(View.GONE);
        llProfileLayout.setVisibility(View.VISIBLE);
    } else {
        btnSignIn.setVisibility(View.VISIBLE);
        btnSignOut.setVisibility(View.GONE);
        btnRevokeAccess.setVisibility(View.GONE);
        llProfileLayout.setVisibility(View.GONE);
    }
}


2 commentaires

En fait, j'ai déjà essayé d'implémenter ViewOnClickListner et de remplacer la méthode OnClick mais rien ne se passe.


J'ai remarqué une chose. Seul le SignButton ne fonctionne pas. J'ai essayé avec Button pour me connecter et cela fonctionne.