在Firebase Phone Auth中调用GetIdTokenAsync()会在Xamarin中引发NullPoin



我正在尝试在Xamarin中实现Firebase电话身份验证。表单应用程序。otp身份验证成功进行,并接收到User对象。但是在调用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:Userspratik.khandelwalsourcereposLawDiaryLawDiaryLawDiary.AndroidAuthDroid.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)
}

是,因为错误消息声明"java.lang.NullPointerException:尝试在SignInWithPhoneAuthCreds的空对象引用上调用虚拟方法‘…FirebaseAuth.zza(com.google.firebase.auth.FirebaseUser,boolean(’">

这意味着您的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;
}

相关内容