Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何通过侦听器检查用户是否通过电子邮件验证?_Android_Firebase_Firebase Authentication - Fatal编程技术网

Android 如何通过侦听器检查用户是否通过电子邮件验证?

Android 如何通过侦听器检查用户是否通过电子邮件验证?,android,firebase,firebase-authentication,Android,Firebase,Firebase Authentication,我有一个活动EmailSignUpActivity,它有两个按钮,一个用于创建用户,另一个用于验证电子邮件。创建用户后,用户将按下验证电子邮件按钮,向注册的电子邮件发送验证电子邮件 我在这里所做的是让用户保持EmailSignUpActivity,直到他验证电子邮件,然后将其发送到MainActivity。为了实现这一点,我使用以下代码: // sending email verification emailVerificationButton.setOnClickListener(n

我有一个活动EmailSignUpActivity,它有两个按钮,一个用于创建用户,另一个用于验证电子邮件。创建用户后,用户将按下验证电子邮件按钮,向注册的电子邮件发送验证电子邮件

我在这里所做的是让用户保持EmailSignUpActivity,直到他验证电子邮件,然后将其发送到MainActivity。为了实现这一点,我使用以下代码:

//  sending email verification
    emailVerificationButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressDialog1.show();

            if(mAuth.getCurrentUser() != null) {

                if (emailEditText.length() != 0 && passwordEditText.length() != 0 && reEnterPasswordEditText.length() != 0) {
                        mAuth.getCurrentUser().sendEmailVerification().addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                progressDialog1.dismiss();

                                Log.d(TAG, "onSuccess: email sent");

                                Toast.makeText(EmailSignUpActivity.this, "Email verification sent", Toast.LENGTH_SHORT).show();

                                /**
                                 * Making the app unresponsive
                                 */
                                while(!mAuth.getCurrentUser().isEmailVerified()){
                                    mAuth.getCurrentUser().reload();
                                }

                                if(mAuth.getCurrentUser().isEmailVerified()){
                                    Toast.makeText(EmailSignUpActivity.this, "Email verified", Toast.LENGTH_SHORT).show();
                                    Intent intent = new Intent(EmailSignUpActivity.this, MainActivity.class);
                                    startActivity(intent);
                                    finish();
                                }
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                progressDialog1.dismiss();

                                Log.w(TAG, "onFailure: Email verification failed ==> ", e);
                            }
                        });
                    }else{
                    Toast.makeText(EmailSignUpActivity.this, "Fill out the details", Toast.LENGTH_SHORT).show();
                }
            }else{
                Toast.makeText(EmailSignUpActivity.this, "Create a user first!", Toast.LENGTH_SHORT).show();
            }
            }
        });

我想在这里通过一个监听器或任何类似的监听器来收听isEmailVerified(),而这些监听器不应该使应用程序无响应。如何实现这一点?

正如您所发现的,使用所谓的紧密无限循环将阻止您的应用程序响应其他用户输入。所以我们很容易同意这是个坏主意。如果有人建议您在Firebase文档中这样做,您能给我一个特定文档的链接吗

您需要找到另一个要响应的事件,以验证用户是否已验证其电子邮件地址。常见的选择有:

  • 为用户提供一个UI元素,以指示他们已验证其电子邮件地址。在您的情况下,这可能不可能,但这是我所知道的最常见的方法
  • 检查电子邮件地址是否在启动时或主活动显示时验证。这通常会进入您的登录流程:登录用户,检查他们的电子邮件地址是否经过验证。如果是这样,你就让他们进入应用程序。如果没有,您可以让他们选择(重新)发送验证电子邮件。考虑到用户需要切换到他们的邮件应用程序以获取验证电子邮件,他们已经在切换出(并因此返回)你的应用程序
  • 在验证电子邮件中指定一个所谓的in。如果您使用此选项发送Firebase动态链接,您可以在用户单击电子邮件中的验证链接(只要他们在同一移动设备上这样做)后,自动将其返回到他们停止的应用程序中
  • 定期检查设备。这与您现在所做的最为相似,但没有紧密的循环。请参阅此问题,以了解此问题的一些选项:

  • 如果您使用主线程(UI线程)执行长时间运行的操作,您的应用程序将变得无响应。当(!mAuth.getCurrentUser().isEmailVerified()){mAuth.getCurrentUser().reload();}?,在单独的线程上执行此操作??为什么循环网络请求?如果您在某些操作(如单击按钮)上选中
    isEmailVerified()
    ,效果会更好。如果Firebase没有为它提供侦听器,那么就立即执行。不要循环请求。这将是一场灾难。@ADM我曾想过为此添加一个按钮,但这不会与UI一起进行。还有什么我能做的吗?我对Firebase不太熟悉,但是如果没有直接的听众参加这个活动,那么你应该试试我建议的方式。@SaranSankaran你的建议与UI很好,我已经使用过了。谢谢,谢谢你的帮助。不,在任何Firebase文档中都没有提到过紧密循环。谢谢你的回复。
    authStateListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
    
                Log.d(TAG, "onAuthStateChanged: method called");
    
                if(firebaseAuth.getCurrentUser() != null)
                    isEmailVerified = firebaseAuth.getCurrentUser().isEmailVerified();
    
                if(isEmailVerified){
                    Toast.makeText(EmailSignUpActivity.this, "Email verified", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(EmailSignUpActivity.this, MainActivity.class);
                    startActivity(intent);
                    finish();
                }
            }
        };
    
        mAuth.addAuthStateListener(authStateListener);