首页 > 解决方案 > 没有验证证明无法创建 PhoneAuthCredential?

问题描述

我已按照 firebase 文档的指南实现登录到我的应用程序,但在注册时出现问题,应用程序崩溃并且 catlog 显示以下错误:

Process: app, PID: 12830
    java.lang.IllegalArgumentException: Cannot create PhoneAuthCredential without either verificationProof, sessionInfo, ortemprary proof.
        at com.google.android.gms.common.internal.Preconditions.checkArgument(Unknown Source)
        at com.google.firebase.auth.PhoneAuthCredential.<init>(Unknown Source)
        at com.google.firebase.auth.PhoneAuthProvider.getCredential(Unknown Source)
        at app.MainActivity.verifyPhoneNumberWithCode(MainActivity.java:132)
        at app.MainActivity.onClick(MainActivity.java:110)
        at android.view.View.performClick(View.java:4803)
        at android.view.View$PerformClick.run(View.java:20102)
        at android.os.Handler.handleCallback(Handler.java:810)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:189)
        at android.app.ActivityThread.main(ActivityThread.java:5532)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:950)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) 

我尝试查看其他代码示例,但它们与我的代码更相似,但我的应用程序仍然因相同的错误而崩溃。

这是我使用 firebase 文档指南编写的代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private FirebaseAuth mAuth;
    private String mVerificationId;
    private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;
    Button login,verify,signout;
    EditText number;
    EditText code;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAuth = FirebaseAuth.getInstance();
        login = findViewById(R.id.btnlogin);
        verify = findViewById(R.id.btnverify);
        signout = findViewById(R.id.btnsignout);
        number = findViewById(R.id.editnumber);
        code = findViewById(R.id.editcode);
        login.setOnClickListener(this);
        verify.setOnClickListener(this);
        signout.setOnClickListener(this);

        mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                signInWithPhoneAuthCredential(phoneAuthCredential);
            }

            @Override
            public void onVerificationFailed(FirebaseException e) {
                Toast.makeText(MainActivity.this, "Error" + e.toString(), Toast.LENGTH_SHORT).show();
                if (e instanceof FirebaseAuthInvalidCredentialsException) {
                    Toast.makeText(MainActivity.this, "Invalid Request " + e.toString(), Toast.LENGTH_SHORT).show();
                } else if (e instanceof FirebaseTooManyRequestsException) {
                    Toast.makeText(MainActivity.this, "The SMS quota for the project has been exceeded " + e.toString(), Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onCodeSent(String vId, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                Toast.makeText(MainActivity.this, "Code Sent" + vId, Toast.LENGTH_SHORT).show();
                number.setText("");
              mVerificationId = vId;
            }
        };
    }

    private void signInWithPhoneAuthCredential(PhoneAuthCredential phoneAuthCredential) {
        mAuth.signInWithCredential(phoneAuthCredential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isComplete()){
                    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                    String uid = null;
                    if (user != null) {
                        uid = user.getUid();
                    }
                    Toast.makeText(MainActivity.this, "Signed In", Toast.LENGTH_SHORT).show();
                    Toast.makeText(MainActivity.this, uid, Toast.LENGTH_SHORT).show();
                } else {
                    if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                        Toast.makeText(MainActivity.this, "Invalid Code", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnlogin: {
                String phonenumber = number.getText().toString();
                startPhoneNumberVerification(phonenumber);
            }
            case R.id.btnverify: {
                String vCode = code.getText().toString();
                verifyPhoneNumberWithCode(mVerificationId, vCode);
            }
            case R.id.btnsignout: {
                mAuth.signOut();
            }
        }
    }

    private void startPhoneNumberVerification(String phoneNumber) {
        PhoneAuthProvider.getInstance().verifyPhoneNumber(phoneNumber, 60, TimeUnit.SECONDS, this, mCallbacks);
    }

    private void verifyPhoneNumberWithCode(String verificationId, String code) {
        PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
        signInWithPhoneAuthCredential(credential);
    }

} 

上面的代码将 otp 发送到给定的号码,但它崩溃了,并且 cat-log 显示了上面提到的错误。

请尝试帮助我找出我的代码中的错误,而不是参考其他代码。

标签: javaandroidfirebase-authentication

解决方案


您获得的号码没有国家代码,例如 +91 使用国家代码或使用

String withCountryCode = "+91"+code PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, withCountryCode); 登录WithPhoneAuthCredential(凭据);


推荐阅读