2016-12-04 175 views
3

我正在使用Firebase的isEmailVerified方法验证电子邮件。以下是代码:电子邮件未在Firebase中验证

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_verifying); 
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    mAuth=FirebaseAuth.getInstance(); 
    spinner=(ProgressBar)findViewById(R.id.progressBar); 
    spinner.setVisibility(View.GONE); 
    Log.e("I am launched","hello"); 
    if(user.isEmailVerified()==true){ 
     Log.e("I am here","hello"); 
     State state= new AccountSettingUp(this); 
     state.doAction(); 
    } else { 
     Log.e("Maybe i am here","yes"); 
     user.sendEmailVerification() 
       .addOnCompleteListener(new OnCompleteListener<Void>() { 
        @Override 
        public void onComplete(@NonNull Task<Void> task) { 
         if (task.isSuccessful()) { 
          Log.d("email", "Email sent."); 
         } 
        } 
       }); 
    } 

这里,else代码只应在电子邮件未验证时运行。但是,即使在验证电子邮件并重新启动活动后,if声明不是true,并且电子邮件再次发送。

回答

4

此行为似乎是Firebase身份验证的当前版本(10.0.1)中的一个限制,可能是一个错误。 this related question中报告了相同的问题。

我试着在电子邮件验证后做了reload()的用户数据。这没有帮助。据相关问题报道,似乎需要注销/登录才能获得新的电子邮件验证状态。

0

对于firebase-auth:10.0.1,似乎这是不可能的。但是,解决方法是将用户登录并再次登录。登录后,isEmailVerified()函数将正常工作。

我做了注册活动

mAuth.createUserWithEmailAndPassword(Email, Password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         if (task.isSuccessful()){ 
          user = mAuth.getCurrentUser(); 
          UserProfileChangeRequest profileChange = new UserProfileChangeRequest.Builder() 
            .setDisplayName(FirstName) 
            .build(); 

          user.updateProfile(profileChange).addOnCompleteListener(new OnCompleteListener<Void>() { 
           @Override 
           public void onComplete(@NonNull Task<Void> task) { 

            if(task.isSuccessful()){ 
             Toast.makeText(getBaseContext(), "Thanks for signing up, " + FirstName + "! Please verify your email!", Toast.LENGTH_SHORT).show(); 
             user.sendEmailVerification(); 
             mAuth.signOut(); 
             Intent a = new Intent(getBaseContext(),Login_Activity.class); 
             startActivity(a); 
            } 
            else { 
             Toast.makeText(getBaseContext(),"Failed to create username",Toast.LENGTH_SHORT).show(); 
            } 
           } 
          }); 

         } 
         else{ 
          Toast.makeText(getBaseContext(),"Failed",Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }); 

如在 'task.isSuccessful()' 的 '.updateProfile' 代码的部分看到的,我做了一个 'mAuth.signOut();'并通知他们在将他们的电子邮件发送回登录屏幕之前验证他们的电子邮件。

在登录屏幕上,我做了一个简单的'if(user.isEmailVerified())'语句来检查验证。如果他们还没有得到验证,敬酒似乎会提醒他们,如果他们得到验证,他们将进入下一个活动。

希望这会有所帮助!