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>
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?
3 Réponses :
-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;
}
Merci, les erreurs ont été corrigées. Cependant, sign_in_button
ne fonctionne pas. Rien ne se passe lorsque je clique dessus.
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>
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.
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); } }
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.
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.