Firebase 身份验证中的验证 ID 为空

问题描述 投票:0回答:2

我正在使用 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 显示错误是:-

  1. 无法初始化 reCAPTCHA 配置:没有为租户/项目配置 Recaptcha Enterprise siteKey *

  2. 致命异常:主java.lang.RuntimeException:无法实例化活动ComponentInfo {com.example.vivetales/com.example.vivetales.verifyOTP}:java.lang.NullPointerException:尝试调用虚拟方法'java.lang.String空对象引用上的 android.content.Intent.getStringExtra(java.lang.String)'

java android firebase android-intent firebase-authentication
2个回答
0
投票

检查 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;
    }

0
投票

您收到此错误:

致命异常:主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()
中。

© www.soinside.com 2019 - 2024. All rights reserved.