FireBase 电话验证

问题描述

所以基本上我实现了电话身份验证方法,它工作正常,我每次都在我的电话上收到 OTP。但问题是我无法从 OnCodeSent 方法提取代码

 public void onCodeSent(@NonNull String verificationId,@NonNull PhoneAuthProvider.ForceResendingToken token) {
    // The SMS verification code has been sent to the provided phone number,we
    // Now need to ask the user to enter the code and then construct a credential
    // by combining the code with a verification ID.
    Log.d(TAG,"onCodeSent:" + verificationId);

    // Save verification ID and resending token so we can use them later
    mVerificationId = verificationId;
    mResendToken = token;
}

当我尝试显示 VerficationId 时,它会显示一个随机字符串,如 AhfjnVDscqQHBFEFvCHdBVQHVQJNCvcHFBhbHBC 而不是我收到的 OTP (523410)。我该如何解决这个问题?

解决方法

从这里开始,回调 in 在您的代码中的其他地方声明。

创建一个名为验证 ID 的公共字符串

    PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L,TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // Activity (for callback binding)
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);

    


mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG,"onVerificationCompleted:" + credential);
    }

    @Override
    public void onVerificationFailed(FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,// for instance if the the phone number format is not valid.
        Log.w(TAG,"onVerificationFailed",e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e `instanceof` FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,@NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number,we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG,"onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mResendToken = token;
        signInCurrentUser(verificationId)
     }
    };
public void signInCurrentUser(String verificationId) {
    
        PhoneAuthCredential authCredential = PhoneAuthProvider.getCredential(verificationId,getCode());
        signInWithPhoneAuthCredential(authCredential);
    
}

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
mAuth.signInWithCredential(credential)
        .addOnCompleteListener(this,new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // Sign in success,update UI with the signed-in user's information
                    Log.d(TAG,"signInWithCredential:success");

                    FirebaseUser user = task.getResult().getUser();
                    // Update UI
                } else {
                    // Sign in failed,display a message and update the UI
                    Log.w(TAG,"signInWithCredential:failure",task.getException());
                    if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                        // The verification code entered was invalid
                    }
                }
            }
        });
   }

get code 方法获取用户输入