Firebase电话验证verifyPhoneNumber()已过时+应用程序崩溃

时间:2020-10-30 12:34:39

标签: android firebase firebase-authentication deprecated

升级电话验证的 Firebase身份验证(20.0.0)依赖项 PhoneAuthProvider.getInstance()。verifyPhoneNumber()

后出现错误

依赖性:

implementation 'com.google.firebase:firebase-auth:20.0.0'

错误:

java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/browser/customtabs/CustomTabsIntent$Builder;
        at com.google.firebase.auth.internal.RecaptchaActivity.zza(com.google.firebase:firebase-auth@@20.0.0:92)
        at com.google.firebase.auth.api.internal.zzeq.zza(com.google.firebase:firebase-auth@@20.0.0:79)
        at com.google.firebase.auth.api.internal.zzeq.onPostExecute(com.google.firebase:firebase-auth@@20.0.0:88)
        at android.os.AsyncTask.finish(AsyncTask.java:755)
        at android.os.AsyncTask.access$900(AsyncTask.java:192)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7948)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.browser.customtabs.CustomTabsIntent$Builder"

谁能解释我应该为新的依赖关系进行哪些更改?有哪些新步骤?

7 个答案:

答案 0 :(得分:15)

这是我删除错误的方法:

我介绍了firebase phone auth documentation并进行了必要的更改:

替换此:

PhoneAuthProvider.getInstance().verifyPhoneNumber(
            phoneNumber, //phone number to be verified
            60, // validity of the OTP
            TimeUnit.SECONDS,
            (Activity) TaskExecutors.MAIN_THREAD,
            mCallBack // onVerificationStateChangedCallback
    );

有了这个

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(mCallBack)          // OnVerificationStateChangedCallbacks
                    .build();
    PhoneAuthProvider.verifyPhoneNumber(options);

此外,将其添加到您的应用/ gradle文件依赖项:

implementation 'androidx.browser:browser:1.2.0'

这将帮助Firebase打开浏览器以进行reCAPTCHA验证。

希望这行得通!

答案 1 :(得分:5)

在新的Firebase身份验证版本中,他们已进行了一些重大更改,例如Recaptcha以便进行人工验证。它需要浏览器进行验证,请在depen下面添加。并了解有关更改refer me

 implementation 'androidx.browser:browser:1.2.0'

答案 2 :(得分:5)

最后,我在Alex Mamo's AnswerThis Documentation的帮助下得到了解决方案

我遵循的步骤:

  1. 更新新的依存关系implementation 'com.google.firebase:firebase-auth:20.0.0'

  2. 更新新代码:

    用于发送OTP:

    PhoneAuthProvider.verifyPhoneNumber(
         PhoneAuthOptions
                 .newBuilder(FirebaseAuth.getInstance())
                 .setActivity(this)
                 .setPhoneNumber(phoneNumber)
                 .setTimeout(60L, TimeUnit.SECONDS)
                 .setCallbacks(mCallbacks)
                 .build());
    

    用于重新发送OTP

    PhoneAuthProvider.verifyPhoneNumber(
             PhoneAuthOptions
                     .newBuilder(FirebaseAuth.getInstance())
                     .setActivity(this)
                     .setPhoneNumber(phoneNumber)
                     .setTimeout(60L, TimeUnit.SECONDS)
                     .setCallbacks(mCallbacks)
                     .setForceResendingToken(token)
                     .build());
    

    仍然,您将得到如下错误:

[SmsRetrieverHelper] SMS验证码请求失败:未知 状态码:17028传递了一个safety_net_token,但没有匹配项 SHA-256已在Firebase控制台中注册。请确保 此应用程序的packageName / SHA256对已在 Firebase控制台。

  1. 您需要从密钥库或JKS文件中复制 SHA-256 ,并在 SHA证书指纹中添加here

    enter image description here

  2. 最后,您做到了。

    无需进行reCAPTCHA验证。

谢谢。

答案 3 :(得分:2)

verifyPhoneNumber(String phoneNumber, long timeout, TimeUnit unit, Activity activity, PhoneAuthProvider.OnVerificationStateChangedCallbacks callbacks)方法的官方文档中已指定:

不推荐使用此方法,而推荐使用verifyPhoneNumber(PhoneAuthOptions)

因此从现在开始,为了验证电话号码,我们需要调用此方法并传递一个PhoneAuthOptions对象作为参数。我认为,这类似于updateProfile(UserProfileChangeRequest request),在这种情况下,我们应该传递PhoneAuthOptions对象作为参数。

答案 4 :(得分:1)

在新的Firebase身份验证版本中,他们已进行了重大更改,例如Recaptcha,SafetyNet以便进行人工验证。通过添加

,我也遇到了同样的问题

实现“ androidx.browser:browser:1.3.0

它解决了我的问题,但是用户体验不是很好,因为Firebase正在打开浏览器来验证Recaptcha,这在应用程序流程中看起来很奇怪。

Firebase报价“ 仅当SafetyNet不可用或您的设备未通过可疑检查时,才会触发reCAPTCHA流程。尽管如此,您仍应确保这两种情况均能正常工作。 因此,要启用SafetyNet,请按照以下步骤操作,否则您也可以访问 https://firebase.google.com/docs/auth/android/phone-auth获取信息

  1. 转到Google云控制台,选择您的项目。

  2. 单击导航菜单,然后选择“ APis和服务”,然后选择“仪表板”。

  3. 单击启用api和服务,然后启用api“ Android设备验证”。

  4. 在firebase项目设置中添加SHA256。(调试并同时释放两者)

答案 5 :(得分:0)

在新的 Firebase 身份验证版本中,他们进行了重大更改,例如用于人工验证的 Recaptcha。它需要浏览器进行验证,因此请在下面添加。阅读有关更改的信息,请参考我

implementation 'androidx.browser:browser:1.2.0'

更新:如果您想避免人工验证,您需要在 Google Cloud Console 中为您的 Firebase 项目启用安全网,请参阅此内容。

答案 6 :(得分:0)

就我而言,我在 firebase 控制台中添加了 SHA 256 并已解决。

谢谢@HimanshiThakur (https://stackoverflow.com/a/65248293/10787285)