Вызов GetIdTokenAsyn c () в Firebase Phone Auth вызывает исключение NullPointerException в Xamarin - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь реализовать проверку подлинности телефона Firebase в приложении Xamarin.Forms. Проверка подлинности otp проходит успешно, и объект User получен. Но при вызове GetIdTokenAsyn c (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 "";
            }
        }

Я получаю следующую ошибку при выполнении вызова GetIdTokenAsyn c

{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)
}

1 Ответ

0 голосов
/ 26 апреля 2020

Да, поскольку в сообщении об ошибке указано «java .lang.NullPointerException: попытка вызвать виртуальный метод« ... FirebaseAuth.zza (com.google.firebase.auth.FirebaseUser, boolean) »для ссылки на пустой объект ... at SignInWithPhoneAuthCreds ”

Это означает, что ваш signInTask имеет значение null, а пользовательский объект отправляется как null. И это потому, что «PhoneAuthCredential credential = 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;
}
...