【问题标题】:Calling GetIdTokenAsync() in Firebase Phone Auth throws NullPointerException in Xamarin在 Firebase Phone Auth 中调用 GetIdTokenAsync() 会在 Xamarin 中引发 NullPointerException
【发布时间】:2020-04-26 09:32:14
【问题描述】:

我正在尝试在 Xamarin.Forms 应用中实现 Firebase 电话身份验证。 otp 身份验证成功并收到用户对象。但是在调用 GetIdTokenAsync(false) 时,我收到了 NullPointerException。

这里是块

public async Task<string> SignInWithPhoneAuthCreds(string otp)
        {
            try
            {
                PhoneAuthCredential credential = PhoneAuthProvider.GetCredential(_phoneAuthCallbacks.VerificationId, otp);
                var signInTask = await _auth.SignInWithCredentialAsync(credential);
                var user = signInTask.User;
                var token = await user.GetIdTokenAsync(false);
                return user.PhoneNumber;
            }
            catch (Exception e)
            {
                return "";
            }
        }

我在调用 GetIdTokenAsync 时收到以下错误

{Java.Lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.tasks.Task com.google.firebase.auth.FirebaseAuth.zza(com.google.firebase.auth.FirebaseUser, boolean)' on a null object reference
  at Java.Interop.JniEnvironment+InstanceMethods.CallObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0006e] in <26521a5118b44c858c385715922b9d5d>:0 
  at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in <26521a5118b44c858c385715922b9d5d>:0 
  at Firebase.Auth.FirebaseUser.GetIdToken (System.Boolean p0) [0x00022] in <fd3fe568403d40c2b79ab43d84a24199>:0 
  at Firebase.Auth.FirebaseUser.GetIdTokenAsync (System.Boolean forceRefresh) [0x00000] in <fd3fe568403d40c2b79ab43d84a24199>:0 
  at LawDiary.Droid.AuthDroid.SignInWithPhoneAuthCreds (System.String otp) [0x000d8] in C:\Users\pratik.khandelwal\source\repos\LawDiary\LawDiary\LawDiary.Android\AuthDroid.cs:56 
  --- End of managed Java.Lang.NullPointerException stack trace ---
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.tasks.Task com.google.firebase.auth.FirebaseAuth.zza(com.google.firebase.auth.FirebaseUser, boolean)' on a null object reference
    at com.google.firebase.auth.FirebaseUser.getIdToken(Unknown Source:4)
    at crc6495d4f5d63cc5c882.AwaitableTaskCompleteListener_1.n_onComplete(Native Method)
    at crc6495d4f5d63cc5c882.AwaitableTaskCompleteListener_1.onComplete(AwaitableTaskCompleteListener_1.java:30)
    at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
}

【问题讨论】:

    标签: android firebase xamarin.forms xamarin.android firebase-authentication


    【解决方案1】:

    是的,因为错误消息指出“java.lang.NullPointerException: Attempt to invoke virtual method '...FirebaseAuth.zza(com.google.firebase.auth.FirebaseUser, boolean)' on an null object reference .. . 在 SignInWithPhoneAuthCreds”

    这意味着您的 signInTask 为 null 并且用户对象作为 null 发送。那是因为 “PhoneAuthCredential 凭证 = PhoneAuthProvider.GetCredential(_phoneAuthCallbacks.VerificationId, otp);”在凭证中存储一个空值。

    在该行之后添加对凭据的空检查,您将不会看到错误。


    根据@Pratik 的回复进行编辑:

    尝试将此添加到您的 try-catch 中,并查看调用了哪个错误消息以获得更好的理解。

    catch (NSErrorException ex)
    {
        Console.WriteLine(ex.Message);
        AuthErrorCode errorCode;
        if (IntPtr.Size == 8) // 64 bits devices
            errorCode = (AuthErrorCode)((long)ex.Error.Code);
        else // 32 bits devices
            errorCode = (AuthErrorCode)((int)ex.Error.Code);
        switch (errorCode)
        {
            case AuthErrorCode.UserNotFound:
                return "ERROR_USER_NOT_FOUND";
            case AuthErrorCode.InvalidEmail:
                return "ERROR_INVALID_EMAIL";
            case AuthErrorCode.UserDisabled:
                return "ERROR_USER_DISABLED";
            case AuthErrorCode.WrongPassword:
                return "ERROR_WRONG_PASSWORD";
            default:
                return "ERROR_EMAIL_OR_PASSWORD_MISSING";
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
        return ex.Message;
    }
    

    【讨论】:

    • 实际上,我调试并检查了 signInTask 和 user 对象不为空。获取像“user.PhoneNumber”这样的其他用户属性可以正常工作。此错误仅在调用“getidtoken”方法时发生。
    • @Pratik 你能看看更新的答案,让我知道错误消息是什么,以及它返回什么
    • 嗨@Saamer,NSErrorException 不应该适用于iOS 吗?此代码适用于 Android 平台。
    猜你喜欢
    • 2019-04-01
    • 2019-03-30
    • 2020-12-13
    • 2021-03-07
    • 2021-12-19
    • 2018-12-24
    • 1970-01-01
    相关资源
    最近更新 更多