我正在使用 Firebase 身份验证和电话号码创建 OTP 验证应用。我做了所有的事情,比如添加依赖项、pugin、JSON 文件,并连接 Firebase 身份验证,但仍然出现此错误。请告诉我该怎么办。
public class MainActivity extends AppCompatActivity {
EditText editMobileNumber;
Button sendButton;
FirebaseAuth mAuth;
PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAuth=FirebaseAuth.getInstance();
editMobileNumber=findViewById(R.id.editMobileNumber);
sendButton=findViewById(R.id.getOTP);
sendButton.setOnClickListener(v -> {
String number=editMobileNumber.getText().toString().trim();
if(number.length() != 10){
Toast.makeText(this,"Enter a valid number",Toast.LENGTH_SHORT).show();
}
else{
otpSend(number);
}
}
);
}
private void otpSend(String number) {
mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
}
@Override
public void onVerificationFailed(@NonNull FirebaseException e) {
Toast.makeText(MainActivity.this,number,Toast.LENGTH_SHORT).show();
}
@Override
public void onCodeSent(@NonNull String verificationId,
@NonNull PhoneAuthProvider.ForceResendingToken token) {
Toast.makeText(MainActivity.this,verificationId,Toast.LENGTH_SHORT).show();
Intent i=new Intent(MainActivity.this, verifyOTP.class);
i.putExtra("verificationId",verificationId);
startActivity(i);
finish();
}
};
PhoneAuthOptions options =
PhoneAuthOptions.newBuilder(mAuth)
.setPhoneNumber("+91" + number) // Phone number for Otp
.setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
.setActivity(this)
.setCallbacks(mCallbacks) // OnVerificationStateChangedCallbacks
.build();
PhoneAuthProvider.verifyPhoneNumber(options);
}
}
验证将在下一个活动中进行。这是代码:-
public class verifyOTP extends AppCompatActivity {
PinView otpPinView;
Button resendOTPButton,verifyButton;
TextView textView;
String verificationId= getIntent().getStringExtra("verificationId"),otp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_verify_otp);
otpPinView=findViewById(R.id.otppinview);
resendOTPButton=findViewById(R.id.resendOTPButton);
verifyButton=findViewById(R.id.verifyButton);
textView=findViewById(R.id.verifyOTP);
textView.setOnClickListener(v -> {
Toast.makeText(this,"it works",Toast.LENGTH_SHORT).show();
});
verifyButton.setOnClickListener(v ->{
otp= Objects.requireNonNull(otpPinView.getText()).toString();
if(otp.length() != 6){
Toast.makeText(this,"Invalid OTP!!",Toast.LENGTH_SHORT).show();
}
else{
if(verificationId != null){
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, otp);
FirebaseAuth.getInstance().signInWithCredential(credential)
.addOnCompleteListener(this, task -> {
if (task.isSuccessful()) {
// If Sign in success
} else {
// If sign in failed
Toast.makeText(this,"Invalid OTP!!",Toast.LENGTH_SHORT).show();
}
});
}
}
});
}
}
logcat 显示错误是:-
无法初始化 reCAPTCHA 配置:没有为租户/项目配置 Recaptcha Enterprise siteKey *
致命异常:主java.lang.RuntimeException:无法实例化活动ComponentInfo {com.example.vivetales/com.example.vivetales.verifyOTP}:java.lang.NullPointerException:尝试调用虚拟方法'java.lang.String空对象引用上的 android.content.Intent.getStringExtra(java.lang.String)'
检查 Firebase 控制台中是否启用了电话身份验证
(!FirebaseAuth.getInstance().getSignInMethods().contains(FirebaseAuth.PHONE_SIGN_IN_METHOD)) {
Toast.makeText(this, "Phone authentication is disabled for this project", Toast.LENGTH_SHORT).show();
return;
}
您收到此错误:
致命异常:主java.lang.RuntimeException:无法实例化活动ComponentInfo {com.example.vivetales/com.example.vivetales.verifyOTP}:java.lang.NullPointerException:尝试调用虚拟方法'java.lang.String android空对象引用上的 .content.Intent.getStringExtra(java.lang.String)'
因为下面这行代码:
String verificationId= getIntent().getStringExtra("verificationId"),otp;
当您拨打
getIntent().
时,此时没有可用的意图。这意味着 getIntent()
是 null
。所以在调用 getIntent()
之前你不能调用 onCreate()
。所以要解决这个问题,你必须将 verificationId
的声明移到 onCreate()
中。