您好我正在尝试使用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秒超时后重新发送短信。所以电话似乎在记忆中保留了一些东西。
答案 0 :(得分:4)
在我的情况下,我的电话号码是
要测试的电话号码(可选)
从那里删除它,firebase开始向我的号码发送短信代码。 Spark Plan每月提供1万次电话授权。这样一来,您无需花一分钱即可测试和部署应用。
答案 1 :(得分:0)
您必须从手机清除此应用程序的数据。如果没有,则run remove app
和restart your phone
将清除与此应用程序相关的所有数据并重新运行。
答案 2 :(得分:0)
如果有人不了解再次发送短信的概念或原因,请仔细阅读以下详细信息。很长一段时间以来,我一直很困惑为什么我第二次,第三次都没有收到短信。
首先阅读原始文档:
onVerificationCompleted(PhoneAuthCredential)
在两种情况下调用此方法:
- 即时验证:在某些情况下,无需发送或输入验证即可立即验证电话号码 代码。
- 自动检索:在某些设备上,Google Play服务可以自动检测传入的验证短信并执行 无需用户操作即可进行验证。 (此功能可能是 某些运营商无法使用。)
我发现的东西:
onVerificationCompleted:
仅在发生即时验证或自动检索时调用。
首次尝试此操作时,您将获得otp代码 来自Google,但下次尝试时,可能会导致立即验证 变得活跃起来。
您可以执行以下操作:
因此,如果您正在调试并且没有问题 从Google接收otp代码只是禁用您的SIM卡并启用它 再次。这将帮助您再次从Google获取otp代码 再输入一次代码,直到获得即时验证 再次激活
请注意:
我认为您无法通过任何方式禁用即时功能 截至目前的验证。但是您总是可以通过某种方式优化代码 不会对您和您的用户造成任何问题。
如果您想探索更多内容,请检查线程:Click here
答案 3 :(得分:0)
就我而言,我找到了下一个解决方案:
如果您已经尝试从电话验证部分的“白名单”中删除用户,尝试从用户数据库中删除电话号码以及进行其他尝试来解决此问题,此解决方案将为您提供帮助。