当前位置: 首页 > 知识库问答 >
问题:

每次调用isEmailVerified()返回false条件时,即使在电子邮件经过验证之后

冯宏恺
2023-03-14

实际上我在这里做什么,当用户登录他们的帐户时,然后我检查他们是否验证了他们的电子邮件地址,如果没有,那么我将启动EmailVerficationactive。当用户单击发送验证电子邮件按钮时,电子邮件验证码将被发送到用户的电子邮件地址。

之后,当用户成功验证他们的电子邮件地址,当他们再次点击发送验证链接按钮。

而不是显示toast消息<code>toast。makeText(这是“您的电子邮件已验证,现在您可以登录了。”,Toast.LENGTH_LONG)。show() ,再次发送电子邮件验证链接。

为什么isEmailVerified()返回false

这是我的电子邮件验证活动

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();
    }
}

共有3个答案

公西鸿博
2023-03-14

我用下面一行来解决这个问题

await FirebaseAuth.instance.currentUser!.reload();

端木令雪
2023-03-14

我是如何解决这个错误的。

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();
                }
            }
        }
    });
}
乜坚成
2023-03-14

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

 类似资料:
  • 我有一个静态的AuthProvider类,它集中了所有的身份验证。 我有以下注册码。 在应用程序上注册后,我收到了一封验证电子邮件,所以我点击了它。当我下次尝试登录时,isEmailVertify返回false。经过一些研究,我认为我应该重新加载用户对象,如下所示: 不幸的是,isEmailVerified仍然返回false。有人知道为什么会这样吗?

  • 我发送电子邮件验证并单击链接。然后我在对象上调用。这总是返回,可能是什么原因?

  • 我目前正在开发一个移动应用程序作为我最后一学期的项目。在我的移动应用程序中,我使用Firebase身份验证进行了此电子邮件验证。这是我执行此功能的教程(如果您感兴趣)。 Firebase登录 我这里的问题是,当我在我的移动应用程序中添加了重置密码功能(本教程的下一部分)时,即使电子邮件经过验证,电子邮件验证警报仍然存在。 设置活动(重置密码和电子邮件验证功能所在) 这是错误日志 这是设置中的图片

  • 我正在尝试在Firebase的帮助下进行电子邮件验证,这是在您注册之后。然后执行此代码,然后应用一个新场景,其中包含一个按钮,用于检查电子邮件是否得到验证。这是两个代码。提前感谢您的任何答案!!我很乐意接受任何建议! 更详细的错误描述:点击链接检查邮件后,尚未验证。我发现在这篇文章中使用< code>isEmailVerified之前,您必须使用< code > signInWithEmailAn

  • 我正在提示我的应用程序用户提供电子邮件凭据。 在用户插入电子邮件并通过后,我想验证该帐户。 我正在使用javax。邮政有没有办法验证帐户?只确保凭据确实有效——否则我想显示一个无效用户并传递消息。 也许是某种表演方式: 并在不发送任何内容的情况下检查身份验证异常。

  • 我有一张登记表,上面有姓名、电子邮件和密码。注册时,会向用户的电子邮件地址发送一个确认链接。但在发送链接之前,我需要验证电子邮件地址。我使用了: 它显示的任何电子邮件都有效,例如, 我从获得的电子邮件并将其存储在中。 我到底要怎么做才能让它成功?