Approche de la dernière étape de l'authentification, mais quelque chose ne va pas dans la méthode handleSignInResult
. Il renvoie le code d'exception 10 (erreur développeur) dans les journaux. Google fournit une description complète:
L'application est mal configurée. Cette erreur n'est pas récupérable et sera traitée comme fatale. Le développeur est un idiot ...
Que dois-je faire pour gérer cela (obtenir un compte) et enfin récupérer les valeurs du compte?
Merci d'avance pour votre aide!!!
Activité principale:
package ru.podgorny.carcall;
import ...
public class MainActivity extends AppCompatActivity {
SignInButton signInButton;
public static final int RC_SIGN_IN = 07;
public static final String TAG = "MainActivity";
TextView tw1;
TextView tw2;
GoogleSignInOptions gso;
GoogleSignInClient mGSC;
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "Activity Works");
findViews();
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
//.requestProfile()
.build();
mGSC = GoogleSignIn.getClient(this, gso); //smth with mGSC variable....
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
onClick2(v);
}
};
signInButton.setOnClickListener(onClickListener);
}
private void findViews() {
Log.d (TAG, "findViews started");
signInButton = findViewById(R.id.idButtonGoogle);
tw1 = findViewById(R.id.textView1);
tw1 = findViewById(R.id.textView2);
Log.d(TAG, "Views finded");
}
public void onClick2(View view) {
Log.d(TAG, "onClick started");
switch (view.getId()) {
case R.id.idButtonGoogle:
signIn();
break;
}
Log.d(TAG, "OnClick Started");
}
public void signIn() {
Intent signInIntent = mGSC.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
Log.d(TAG, "startActivityForResult works");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "OnActivityResult started");
// 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.
Log.d(TAG, "TASK started");
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
Log.d(TAG, "OnActivityResult returned");
}
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);//ERROR -- Code 10
Log.d(TAG, "Account received");
updateUI(account);
Log.d(TAG, "updateUI Launched");
} catch (ApiException e) {
Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
updateUI(null);
}
}
private void updateUI(GoogleSignInAccount account) {
if (account!=null) {
tw1.setText("OK");
tw2.setText("Name: " + account.getGivenName() + ", Family name: " + account.getFamilyName() + ", Email: " + account.getEmail() /*+ " image: " +
account.getPhotoUrl()*/);
}else {
tw1.setText("SMTH wrong");
}
}
}
Cette erreur peut se produire si vous n'utilisez pas le même projet dans console.developers.google et console.firebase.google.com. Si le projet est le même sur les deux consoles, assurez-vous d'avoir correctement ajouté votre clé SHA1. Obtenez SHA1 à partir de Android studio.
J'ai atterri dans le même problème et perdu des heures. En creusant plus profondément dans OAuth et OpenId, j'ai compris la raison. Nous faisons ici une erreur conceptuelle.
Pour Android ou toute autre plate-forme (à l'exception du Web), vous devez créer au moins deux types d'ID client dans le même projet de la console API Google. Ces types d'ID client sont les suivants:
Vous pouvez les créer dans n'importe quel ordre. Lors de la création Android tapez l'ID client, vous devez donner le nom du package et SHA1. Lors de la création de l'ID d'application Web, il vous suffit de donner un nom.
Vous n'avez rien d'autre à faire avec ces identifiants jusqu'à ce que vous vouliez vérifier l'utilisateur de votre backend. En d'autres termes, si vous souhaitez que votre serveur d'arrière-plan interroge le serveur Google sur les informations de cet utilisateur, seul vous aurez besoin de l'ID d'application Web. Le flux conceptuel est le suivant:
Envoyez cet ID client d'application Web depuis Android App vers le serveur principal.
Utilisez cet ID d'application Web si vous souhaitez vérifier l'utilisateur sur votre serveur principal.
Je voudrais ajouter des informations supplémentaires sur pourquoi la réponse @Patrick R (ci-dessus fonctionne/marquée comme correcte). Pour exécuter votre projet/pratique, la console Google doit identifier votre application via la clé SHA-1 lorsqu'elle est distribuée sur Google Play Market, Cependant, lorsque vous expérimentez simplement avec la confirmation de connexion et la preuve de concept, puis il associe la clé de débogage SHA-1 (votre application la génère automatiquement) à cette fin précise, en gardant vos modifications de test et de production modulaires.