在isEmailVerified()的每次调用上返回错误条件,即使在验证电子邮件之后

时间:2020-03-18 07:00:44

标签: java android firebase firebase-authentication

我实际上在这里做什么,当用户登录到他们的帐户时,然后我检查他们是否验证了他们的电子邮件地址,如果没有,则我正在启动EmailVerificationActivity。 用户单击 SEND VERIFICATION EMAIL (发送验证电子邮件)按钮后,将从该位置将电子邮件验证代码发送到用户的电子邮件地址。

User is sending email verification link

此后,当用户成功验证其电子邮件地址时,再次单击 SEND VERIFICATION LINK 按钮。

而不是显示吐司消息 Toast.makeText(this, "Your email has been verified, Now you can login.", Toast.LENGTH_LONG).show();, 重新发送电子邮件验证链接。

sending email verification link again

为什么isEmailVerified()返回false条件。

这是我的 EmailVerificationActivity

package com.socialcodia.sherewatan;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class EmailVerificationActivity extends AppCompatActivity {

    private TextView tvEmailAddress;
    private Button btnSendVerificationEmail, btnSignOut;

    //Firebase
    FirebaseAuth mAuth;
    FirebaseUser mUser;

    String email;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_email_verification);

        //Init
        tvEmailAddress = findViewById(R.id.tvEmailAddress);
        btnSendVerificationEmail = findViewById(R.id.btnSendVerificationEmail);
        btnSignOut = findViewById(R.id.btnSignOut);

        //Firebase Init
        mAuth = FirebaseAuth.getInstance();
        mUser = mAuth.getCurrentUser();

        // get and set email address
        email = mUser.getEmail();
        tvEmailAddress.setText(email);

        btnSignOut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signOut();
            }
        });

        btnSendVerificationEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isEmailVerified();
            }
        });
    }

    private void isEmailVerified()
    {
        if (mAuth.getCurrentUser()!=null)
        {
            boolean isEmailVerified = mAuth.getCurrentUser().isEmailVerified();
            if (isEmailVerified)
            {
                Toast.makeText(this, "Your email has been verified, Now you can login.", Toast.LENGTH_LONG).show();
            }
            else
            {
                sendVerificationEmail();
            }
        }
    }

    private void sendVerificationEmail()
    {
        mAuth.getCurrentUser().sendEmailVerification().addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful())
                {
                    Toast.makeText(EmailVerificationActivity.this, "Email verification link has been sent", Toast.LENGTH_SHORT).show();
                }
                else
                {
                    Toast.makeText(EmailVerificationActivity.this, "Oops! Failed to send email verification link", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void sendToLoginWithEmail()
    {
        Intent intent= new Intent(getApplicationContext(),LoginActivity.class);
        intent.putExtra("email",email);
        startActivity(intent);
        finish();
    }

    private void signOut()
    {
        mAuth.signOut();
        sendToLoginWithEmail();
    }
}

2 个答案:

答案 0 :(得分:2)

您需要重新加载当前的用户信息。您会看到通过身份验证获得的用户数据很旧,您需要检索最新的数据。为此,请使用reload()方法。

答案 1 :(得分:2)

我如何解决该错误。

private void isEmailVerified()
{
    mAuth.getCurrentUser().reload().addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            if (mAuth.getCurrentUser()!=null)
            {
                boolean isEmailVerified = mAuth.getCurrentUser().isEmailVerified();
                if (isEmailVerified)
                {
                    Toast.makeText(getApplicationContext(), "Your email has been verified, Now you can login.", Toast.LENGTH_LONG).show();
                }
                else
                {
                    sendVerificationEmail();
                }
            }
        }
    });
}