无法在没有 verifyProof、sessionInfo、临时证明或注册 ID 的情况下创建 PhoneAuthCredential

Ali*_*min 5 android firebase firebase-authentication

我正在处理firebase电话身份验证,在我的电话号码上收到代码后,代码跳转到verifysignincode()方法,但无法创建phoneAuthCredentials. 程序捕获的例外是“不能在没有、、临时证明或注册 ID 的PhoneAuthCredential情况下创建”。verificationProofsessionInfo

这是我的发送代码方法:

    public void send_code(){
    mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        @Override
        public void onCodeSent(@NonNull String s, @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
            super.onCodeSent(s, forceResendingToken);
            Log.d("code", "onCodeSent:" + s);
            verificationID=s;
        }
        @Override
        public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {

        }
        @Override
        public void onVerificationFailed(@NonNull FirebaseException e) {
            Toast.makeText(PhoneAuthentication.this, e.getMessage(), Toast.LENGTH_SHORT);
        }
    };
    mPhoneAuthProvider.verifyPhoneNumber(
            user_contact , 60, TimeUnit.SECONDS, PhoneAuthentication.this, mCallbacks
    );}
Run Code Online (Sandbox Code Playgroud)

这是我的验证登录方法:

    public void verifySignInCode(String code){
    try {
        PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationID, code);
        signInWithPhoneAuthCredential(credential);
    }catch (Exception e){
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();

    }
}
Run Code Online (Sandbox Code Playgroud)

这是我使用电话凭据登录的方法:

    private  void signInWithPhoneAuthCredential(PhoneAuthCredential credential){
    mFirebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if(task.isSuccessful()){

                        startActivity(new Intent(PhoneAuthentication.this, UserHome.class));
                    }
                    else {
                        Log.d("error:", task.getException().getMessage());

                    }
                }
            });
}
Run Code Online (Sandbox Code Playgroud)

错误:

无法在没有 verifyProof、sessionInfo、临时证明或注册 ID 的情况下创建 PhoneAuthCredential。

小智 3

问题:这让我很恼火,经过研究,我发现这种情况的发生是由于手机内存不足或网络连接较低造成的。当您使用验证ID(即log.d(TAG,verificationId))维护日志时,它会在verificationId中显示null,并且根据错误,它说无法在没有验证证明的情况下创建PhoneAuthCredential,并且verificationId是我们的验证证明。

解决方案:

  1. 清除手机缓存并再次尝试签名。转到应用程序信息并清除缓存。
  2. 恢复实例状态
private String verificationId;
private static final String KEY_VERIFICATION_ID = "key_verification_id";

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

    // Restore instance state
    // put this code after starting phone number verification
    if (verificationId == null && savedInstanceState != null) {
        onRestoreInstanceState(savedInstanceState);
    }
}//end of onCreate

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString(KEY_VERIFICATION_ID,verificationId);
}

@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    verificationId = savedInstanceState.getString(KEY_VERIFICATION_ID);
}
Run Code Online (Sandbox Code Playgroud)

发生的情况是,verificationId 存储在本地,有时会由于内存不足而丢失。因此,为了解决这种情况,我们必须恢复实例状态,这不会让verificationId丢失。