Ich verwende FirebaseUI-auth in meiner App, um Benutzer mit E-Mail und Facebook anmelden.Wie kann ich E-Mails verifizieren, ohne sich bei der Verwendung von FirebaseUI-auth erneut anmelden zu müssen?
Wenn sich ein Benutzer per E-Mail anmeldet, wird er zu einem Bildschirm geführt, auf dem ein Text angezeigt wird, der ihn auffordert, seine E-Mail zu bestätigen.
Hier ist mein Code:
continue_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivityForResult(
// Get an instance of AuthUI based on the default app
AuthUI.getInstance()
.createSignInIntentBuilder()
.setProviders(Arrays.asList(new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
new AuthUI.IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build()))
.setIsSmartLockEnabled(!BuildConfig.DEBUG)
.build(),
RC_SIGN_IN);
}
});
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// RC_SIGN_IN is the request code you passed into startActivityForResult(...) when starting the sign in flow.
if (requestCode == RC_SIGN_IN) {
IdpResponse response = IdpResponse.fromResultIntent(data);
// Successfully signed in
if (resultCode == ResultCodes.OK) {
Intent intent = new Intent(SignUpActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
return;
} else {
// Sign in failed
if (response == null) {
// User pressed back button
Toast.makeText(getBaseContext(), "Sign in cancelled", Toast.LENGTH_SHORT).show();
return;
}
if (response.getErrorCode() == ErrorCodes.NO_NETWORK) {
Toast.makeText(getBaseContext(), "No internet", Toast.LENGTH_SHORT).show();
return;
}
if (response.getErrorCode() == ErrorCodes.UNKNOWN_ERROR) {
Toast.makeText(getBaseContext(), "Unknown error", Toast.LENGTH_SHORT).show();
return;
}
}
Toast.makeText(getBaseContext(), "Unknown sign in response", Toast.LENGTH_SHORT).show();
}
}
Als er auf den Bestätigungslink zu ihm klickt gesendet, wird seine E-Mail, aber jetzt überprüft, wenn er kommt zurück in die App oder wenn er die App schließen und wieder öffnet, wird der Bildschirm zeigt immer noch den Text zum Überprüfen der E-Mail an und wenn er sich nach der Überprüfung der E-Mail abmeldet und wieder anmeldet, darf nur er Zugriff auf die App haben.
Hier ist der Code, der bestimmt, ob E-Mail überprüft wird oder nicht:
if (auth.getCurrentUser() != null) {
if (auth.getCurrentUser().getProviders().contains("password")) {
boolean emailVerified = auth.getCurrentUser().isEmailVerified();
if (emailVerified) {
Toast.makeText(getBaseContext(), "Email has been verified", Toast.LENGTH_SHORT).show();
emailNotVerifiedTxt.setVisibility(View.INVISIBLE);
openEmailBtn.setVisibility(View.INVISIBLE);
} else {
emailNotVerifiedTxt.setVisibility(View.VISIBLE);
openEmailBtn.setVisibility(View.VISIBLE);
auth.getCurrentUser().sendEmailVerification()
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Snackbar snackbar = Snackbar
.make(coordinatorLayout, "An email verification link has been sent to " + auth.getCurrentUser().getEmail(), Snackbar.LENGTH_LONG);
snackbar.show();
}
}
});
}
}
}
Hier onResume()
:
@Override
protected void onResume() {
super.onResume();
if (auth != null) {
if (auth.getCurrentUser() != null) {
auth.getCurrentUser().reload();
}
}
}
Was ich wissen will, ist, wie kann ich dem Anwender vollen Zugriff auf die App geben ohne dass er sich abmeldet und wieder anmeldet, sobald seine E-Mail-Adresse verifiziert ist?
Bitte lassen Sie es mich wissen.
siehe den Code, den ich in 'onResume()' in der aktualisierten Frage hinzugefügt habe. Es funktioniert immer noch nicht. –
Das Reload muss nicht unbedingt den Listener onAuthStateChanged auslösen. Nachdem Sie neu geladen haben, müssen Sie überprüfen, ob der Benutzer verifiziert ist oder nicht, und dann die E-Mail bei Bedarf senden. – bojeil