如何使用 Android Studio 在 firebase 中检查“用户电子邮件已经存在”

Dai*_*isy 8 java android firebase firebase-authentication

我正在尝试更改我的代码。但是,它失败了。我的输出还是一样。也就是说,如果用户放置了一个已经存在或不存在的电子邮件。验证“此电子邮件已被注册。” 还是出来了。为什么?有人我的编码有什么问题吗?

这是我的方法:-

public boolean isCheckEmail(final String email)
{
    mAuth.fetchProvidersForEmail(email).addOnCompleteListener(new OnCompleteListener<ProviderQueryResult>()
    {
        @Override
        public void onComplete(@NonNull Task<ProviderQueryResult> task)
        {
            boolean check = !task.getResult().getProviders().isEmpty();

            if(check)
            {
                Toast.makeText(Signup.this, "This email has been registered.", Toast.LENGTH_SHORT).show();
            }

            else
            {
                Toast.makeText(Signup.this, "This email has been registered.", Toast.LENGTH_SHORT).show();
            }
        }
    });
    return true;
}
Run Code Online (Sandbox Code Playgroud)

虽然这半编码,我试图回调方法 isCheckEmail:-

 private void RegisterAccount(String firstname, String lastname, String email, String password, String confirmpass)
{
    if (TextUtils.isEmpty(email))
    {
        Toast.makeText(Signup.this, "Enter your email address.", Toast.LENGTH_SHORT).show();
    }

    else if (!isValidEmail(email)) {
        Toast.makeText(Signup.this,"Please enter your valid email address.",Toast.LENGTH_SHORT).show();
    }

    else if (!isCheckEmail(email))
    {
        Toast.makeText(Signup.this, "This email has been registered.", Toast.LENGTH_SHORT).show();
    }
Run Code Online (Sandbox Code Playgroud)

Moh*_*hia 5

fetchProvidersForEmail 是一个异步调用,因此您必须在回调中使用其返回值。

在主线程上返回 true 将不起作用。

这是解决方案:

首先用方法创建接口(成功)

public interface OnEmailCheckListener(){
 void onSuccess(boolean isRegistered);
} 
Run Code Online (Sandbox Code Playgroud)

你的 checkEmail 方法应该是这样的:

public void isCheckEmail(final String email,final OnEmailCheckListener listener){
mAuth.fetchProvidersForEmail(email).addOnCompleteListener(new OnCompleteListener<ProviderQueryResult>()
{
    @Override
    public void onComplete(@NonNull Task<ProviderQueryResult> task)
    {
        boolean check = !task.getResult().getProviders().isEmpty();
        
        listener.onSuccess(check);
     
    }
});

}
Run Code Online (Sandbox Code Playgroud)

最后像这样调用你的 isCheckEmail :

isCheckEmail("yourEmail@test.com",new OnEmailCheckListener(){
   @Override
   void onSuccess(boolean isRegistered){
    
     if(isRegistered){
           //The email was registered before
    } else {
           //The email not registered before
    }

   }
});
Run Code Online (Sandbox Code Playgroud)

希望这对你有帮助。


Sai*_*i N 5

此方法可用于检查电子邮件是否存在

 void checkEmailExistsOrNot(){
    firebaseauth.fetchSignInMethodsForEmail(email.getText().toString()).addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() {
        @Override
        public void onComplete(@NonNull Task<SignInMethodQueryResult> task) {
            Log.d(TAG,""+task.getResult().getSignInMethods().size());
            if (task.getResult().getSignInMethods().size() == 0){
                // email not existed
            }else {
                // email existed
            }

        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            e.printStackTrace();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)