Android Firebase手机验证第二次没有收到短信

时间:2018-05-26 00:29:57

标签: android firebase firebase-authentication

您好我正在尝试使用firebase在Android中进行手机验证。我第一次安装应用程序短信来了,验证成功但随后短信不再来了。我已经从firebase中的auth中删除了用户,但仍无法正常工作。

以下是我的代码。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    CountryCodePicker ccp;

    EditText editTextPhone, editTextCode;

    FirebaseAuth mAuth;

    String codeSent;

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

        mAuth = FirebaseAuth.getInstance();

        editTextCode = findViewById(R.id.editTextCode);
        editTextPhone = findViewById(R.id.editTextPhone);

        findViewById(R.id.buttonGetVerificationCode).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendVerificationCode();
            }
        });

        findViewById(R.id.buttonSignIn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                verifySignInCode();
            }
        });
    }

    private void verifySignInCode() {
        String code = editTextCode.getText().toString();
        PhoneAuthCredential credential = PhoneAuthProvider.getCredential(codeSent, code);
        signInWithPhoneAuthCredential(credential);
    }

    private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            //here you can open new activity
                            Toast.makeText(getApplicationContext(),
                                    "Login Successfull", Toast.LENGTH_LONG).show();
                        } else {
                            if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                                Toast.makeText(getApplicationContext(),
                                        "Incorrect Verification Code ", Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                });
    }

    private void sendVerificationCode() {

        String phone = editTextPhone.getText().toString();

        if (phone.isEmpty()) {
            editTextPhone.setError("Phone number is required");
            editTextPhone.requestFocus();
            return;
        }

        if (phone.length() < 6 || phone.length() > 13) {
            editTextPhone.setError("Please enter a valid phone");
            editTextPhone.requestFocus();
            return;
        }

        PhoneAuthProvider.getInstance().verifyPhoneNumber(
                phone,        // Phone number to verify
                60,                 // Timeout duration
                TimeUnit.SECONDS,   // Unit of timeout
                this,               // Activity (for callback binding)
                mCallbacks);        // OnVerificationStateChangedCallbacks

        Toast.makeText(MainActivity.this,
                "SMS Sent, Please Wait....", Toast.LENGTH_LONG).show();

        editTextCode.requestFocus();

    }

    PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        @Override
        public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {

        }

        @Override
        public void onVerificationFailed(FirebaseException e) {

        }

        @Override
        public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
            super.onCodeSent(s, forceResendingToken);

            codeSent = s;
        }
    };

}

修改 重新启动手机允许在上述功能设置的60秒超时后重新发送短信。所以电话似乎在记忆中保留了一些东西。

4 个答案:

答案 0 :(得分:4)

在我的情况下,我的电话号码是

  

要测试的电话号码(可选)

从那里删除它,firebase开始向我的号码发送短信代码。 Spark Plan每月提供1万次电话授权。这样一来,您无需花一分钱即可测试和部署应用。

答案 1 :(得分:0)

您必须从手机清除此应用程序的数据。如果没有,则run remove apprestart your phone将清除与此应用程序相关的所有数据并重新运行。

答案 2 :(得分:0)

如果有人不了解再次发送短信的概念或原因,请仔细阅读以下详细信息。很长一段时间以来,我一直很困惑为什么我第二次,第三次都没有收到短信。

首先阅读原始文档:

  

onVerificationCompleted(PhoneAuthCredential)

     

在两种情况下调用此方法:

     
      
  • 即时验证:在某些情况下,无需发送或输入验证即可立即验证电话号码   代码。
  •   
  • 自动检索:在某些设备上,Google Play服务可以自动检测传入的验证短信并执行   无需用户操作即可进行验证。 (此功能可能是   某些运营商无法使用。)
  •   

我发现的东西:

onVerificationCompleted:

  

仅在发生即时验证或自动检索时调用。

首次尝试此操作时,您将获得otp代码 来自Google,但下次尝试时,可能会导致立即验证 变得活跃起来。

您可以执行以下操作:

因此,如果您正在调试并且没有问题 从Google接收otp代码只是禁用您的SIM卡并启用它 再次。这将帮助您再次从Google获取otp代码 再输入一次代码,直到获得即时验证 再次激活

请注意:

我认为您无法通过任何方式禁用即时功能 截至目前的验证。但是您总是可以通过某种方式优化代码 不会对您和您的用户造成任何问题。

如果您想探索更多内容,请检查线程:Click here

答案 3 :(得分:0)

就我而言,我找到了下一个解决方案:

  1. 您需要将Google Play市场更新为最新版本。您可以这样操作:转到Play Market->单击“汉堡按钮”->在菜单中选择“设置”->转到菜单底部,您将找到“ Play Market版本”->单击进去
  2. 转到电话设置->转到应用程序部分->选择Google Play设置应用->清除数据\聊天->然后选择Google Play市场应用->清除数据\聊天
  3. 完成上述步骤后,重新启动设备。
  4. 再试一次将短信发送到您的设备。

如果您已经尝试从电话验证部分的“白名单”中删除用户,尝试从用户数据库中删除电话号码以及进行其他尝试来解决此问题,此解决方案将为您提供帮助。