【问题标题】:Firebase Phone Authentication not working after creating a signed APK创建签名的 APK 后,Firebase 电话身份验证不起作用
【发布时间】:2020-05-08 08:18:15
【问题描述】:

我的应用程序工作正常,直到我在 Android Studio 中生成一个签名的 APK,当我对签名的 Apk 进行身份验证时,它只显示一个 Toast“无法验证手机并创建帐户”。它在调试模式下运行良好。当我制作调试 APK 时,它在其中也运行良好,但在签名 APK 中运行良好。我无法弄清楚是什么导致了身份验证在签名 APK 中不起作用

我的代码

   public class Register2 extends AppCompatActivity {

    FirebaseAuth auth;
    DatabaseReference reference;

    String otpCode;
    String verificationId;
    MaterialEditText phone, optEnter;
    Button next;
    CountryCodePicker countryCodePicker;

    PhoneAuthCredential credential;
    Boolean verificationOnProgress = false;
    ProgressBar progressBar;
    TextView resend;

    PhoneAuthProvider.ForceResendingToken token;

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

        phone = findViewById(R.id.phone);
        optEnter = findViewById(R.id.codeEnter);
        countryCodePicker = findViewById(R.id.ccp);
        next = findViewById(R.id.nextBtn);
        auth = FirebaseAuth.getInstance();
        progressBar = findViewById(R.id.progressBar);
        resend = findViewById(R.id.resendOtpBtn);

        resend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // todo:: resend OTP
            }
        });

        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (!phone.getText().toString().isEmpty() && phone.getText().toString().length() == 10) {
                    if (!verificationOnProgress) {
                        next.setEnabled(false);
                        String phoneNum = "+" + countryCodePicker.getSelectedCountryCode() + phone.getText().toString();
                        Log.d("phone", "Phone No.: " + phoneNum);
                        progressBar.setVisibility(View.VISIBLE);
                        requestPhoneAuth(phoneNum);
                    } else {
                        next.setEnabled(false);
                        optEnter.setVisibility(View.GONE);
                        progressBar.setVisibility(View.VISIBLE);
                        otpCode = optEnter.getText().toString();
                        if (otpCode.isEmpty()) {
                            optEnter.setError("Required");
                            return;
                        }

                        credential = PhoneAuthProvider.getCredential(verificationId, otpCode);
                        verifyAuth(credential);
                    }

                } else {
                    phone.setError("Valid Phone Required");
                }
            }
        });
    }

    private void requestPhoneAuth(String phoneNumber) {
        PhoneAuthProvider.getInstance().verifyPhoneNumber(phoneNumber, 60L, TimeUnit.SECONDS, this,
                new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

                    @Override
                    public void onCodeAutoRetrievalTimeOut(String s) {
                        super.onCodeAutoRetrievalTimeOut(s);
                        Toast.makeText(Register2.this, "OTP Timeout, Please Re-generate the OTP Again.", Toast.LENGTH_SHORT).show();
                        resend.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                        super.onCodeSent(s, forceResendingToken);
                        verificationId = s;
                        token = forceResendingToken;
                        verificationOnProgress = true;
                        progressBar.setVisibility(View.GONE);
                        next.setText("Verify");
                        next.setEnabled(true);
                        optEnter.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {


                        verifyAuth(phoneAuthCredential);


                    }

                    @Override
                    public void onVerificationFailed(FirebaseException e) {
                        Toast.makeText(Register2.this, e.getMessage(), Toast.LENGTH_SHORT).show();

                    }
                });
    }


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

                    Toast.makeText(Register2.this, "Phone Verified", Toast.LENGTH_SHORT).show();

                    FirebaseUser firebaseUser = auth.getCurrentUser();
                    String userid = firebaseUser.getUid();
                    reference = FirebaseDatabase.getInstance().getReference().child("UserIds").child(userid);
                    reference.setValue(true);


                    //checkUserProfile();


                } else {
                    progressBar.setVisibility(View.GONE);
                    Toast.makeText(Register2.this, "Can not Verify phone and Create Account.", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();

        if (auth.getCurrentUser() != null) {
            progressBar.setVisibility(View.VISIBLE);

            checkUserProfile();
        }
    }


    private void checkUserProfile() {


        Intent intent = new Intent(Register2.this, Details3.class);
        startActivity(intent);

    }

}

【问题讨论】:

    标签: android firebase firebase-authentication


    【解决方案1】:

    将应用程序上传到 Google Play 商店后,您必须在 Firebase 中更新 SHA-1/SHA-255 指纹。您可以在 Play 商店中找到给定的 SHA-1/SHA-255。

    1. 导航到 Google Play 控制台并登录
    2. 选择您要签名的应用程序
    3. 转到版本管理 > 应用签名
    4. 从应用签名证书部分复制/下载 SHA-1 或 SHA-256 证书指纹

    现在,将 SHA-1/SHA-255 添加到 Firebase,您的应用将再次返回。

    【讨论】:

    • 我的电脑中的已发布 APK 副本未通过身份验证是否正常?
    • @ShivamSingh 完成给定步骤后,从 Play 商店下载应用程序并检查是否一切正常。好吧,您的 firebase 项目可能有多个指纹,因此您可以同时保留发布和调试指纹,并且两个应用程序都应该可以工作。
    • 我尝试只更改 SHA-1 但它不起作用,然后我也更改了 SHA-256。我拿到了一次性密码。但来自 Firestore 的数据未显示在应用程序中。我应该删除旧的 SHA-1 和 SHA-256 吗?
    • 是的,你可以试试。更新密钥后,请稍等片刻以反映。这在文档中的任何地方都没有提到,但它有时会起作用。
    【解决方案2】:

    您是否添加了您的应用SHA-1 Fingerprint in Firebase Console,如果没有,请关注此link

    【讨论】:

    • 我补充说,这就是为什么我能够在调试 APK 中验证实数
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2018-09-30
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多