使用Facebook身份验证的Xamarin.Droid Firebase

时间:2017-06-20 17:28:14

标签: c# android firebase xamarin firebase-authentication

经过数小时的研究,我一直在努力完成这项工作。我已经做了进一步的改进,这就是我所拥有的。我能够成功登录,但接下来要做的是让Firebase显示已登录的用户。这就是我现在几个小时都在苦苦挣扎的事情。

当我从我的代码firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, new IOnCompleteListener<IAuthResult>());中取出这一行时,我能够成功登录,但用户不会在Firebase上显示。

但是当我包含行firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, new IOnCompleteListener<IAuthResult>());时,我得到 System.NullReferenceException已被抛出,我实际上并不知道错误的来源。请帮忙。

谢谢。

public class LoginActivity : BaseActivity, IFacebookCallback, IAuthStateListener, IOnCompleteListener

    {
        private ICallbackManager mCallbackManager;
        private Firebase.Auth.FirebaseAuth firebaseAuth;
        private IOnCompleteListener listener;
        public static FirebaseApp app;

    private Firebase.Auth.FirebaseAuth.IAuthStateListener firebaseAuthListener;

    protected  override void OnCreate(Bundle savedInstanceState)
    {

        base.OnCreate(savedInstanceState);
        FacebookSdk.SdkInitialize(this.ApplicationContext);

        LoginButton button = FindViewById<LoginButton>(Resource.Id.login_button);

        button.SetReadPermissions("email","public_profile");

        mCallbackManager = CallbackManagerFactory.Create();

        button.RegisterCallback(mCallbackManager, this);

    }

    public void handleFacebookAccessToken(AccessToken accessToken)
    {
        AuthCredential credential = FacebookAuthProvider.GetCredential(accessToken.Token);
        firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, new IOnCompleteListener<IAuthResult>());

    }                                                                                                                                            


    public void OnAuthStateChanged(Firebase.Auth.FirebaseAuth auth)
    {
        FirebaseUser user = firebaseAuth.CurrentUser;
        if (user != null)
        {

            Console.WriteLine("The current user is " + firebaseAuth.CurrentUser);

        }

        Console.WriteLine("The current user is " + firebaseAuth.CurrentUser);

    }


    public void OnCancel()
    {
        throw new NotImplementedException();
    }

    public void OnError(FacebookException p0)
    {
        throw new NotImplementedException();
    }

    public void OnSuccess(Java.Lang.Object result)
    {
        LoginResult loginResult = result as LoginResult;
        handleFacebookAccessToken(loginResult.AccessToken);
        Console.WriteLine("My token is" + loginResult.AccessToken);

    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)

    {
        base.OnActivityResult(requestCode, resultCode, data);
        mCallbackManager.OnActivityResult(requestCode, (int)resultCode, data );
    }


    protected override void OnStart(){
        base.OnStart();
       // firebaseAuth.AddAuthStateListener(firebaseAuthListener);
    }

    protected override void OnStop(){
        base.OnStop();
       // firebaseAuth.RemoveAuthStateListener(firebaseAuthListener);
    }

        private class IOnCompleteListener<T> : IOnCompleteListener
        {
            public IntPtr Handle => throw new NotImplementedException();

            public void Dispose()
            {
                throw new NotImplementedException();
            }

            public void OnComplete(Android.Gms.Tasks.Task task)
            {
                if (!task.IsSuccessful)
                {

                }
                else
                {


                }
            }
        }
    }

}

1 个答案:

答案 0 :(得分:2)

我看到您已尝试为IOnCompleteListener实施LoginActivity,但我在您的代码中找不到public void OnComplete(Task task),请确保您&# 39;已实施Android.Gms.Tasks.IOnCompleteListener,如果您这样做,则只需将代码firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, new IOnCompleteListener<IAuthResult>());更改为firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, this);

以下是我的演示,它在我身边起作用:

[Activity(Label = "Activity3", Exported = true)]
[IntentFilter(new[] { Intent.ActionView },
DataScheme = "@string/fb_login_protocol_scheme"),]
public class Activity3 : Activity, IFacebookCallback, IOnCompleteListener
{
    private ICallbackManager mCallbackManager;
    private FirebaseAuth mAuth;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        FacebookSdk.SdkInitialize(this.ApplicationContext);
        // Create your application here
        SetContentView(Resource.Layout.layout3);

        FirebaseApp.InitializeApp(this);
        mAuth = FirebaseAuth.Instance;

        LoginButton fblogin = FindViewById<LoginButton>(Resource.Id.fblogin);
        fblogin.SetReadPermissions("email", "public_profile");

        mCallbackManager = CallbackManagerFactory.Create();
        fblogin.RegisterCallback(mCallbackManager, this);
    }

    private void handleFacebookAccessToken(AccessToken accessToken)
    {
        AuthCredential credential = FacebookAuthProvider.GetCredential(accessToken.Token);
        mAuth.SignInWithCredential(credential).AddOnCompleteListener(this, this);
    }

    //facebook IFacebookCallback implementation
    public void OnSuccess(Java.Lang.Object p0)
    {
        LoginResult loginResult = p0 as LoginResult;
        handleFacebookAccessToken(loginResult.AccessToken);
    }

    public void OnCancel()
    {
    }

    public void OnError(FacebookException p0)
    {
    }

    //firebase IOnCompleteListener implementation
    public void OnComplete(Task task)
    {
        if (task.IsSuccessful)
        {
            FirebaseUser user = mAuth.CurrentUser;
        }
        else
        {
            Toast.MakeText(this, "Authentication failed.", ToastLength.Short).Show();
        }
    }

    // acitivity lifecycle
    protected override void OnStart()
    {
        base.OnStart();
        FirebaseUser currentUser = mAuth.CurrentUser;
    }

    protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        var resultCodeNum = 0;
        switch (resultCode)
        {
            case Result.Ok:
                resultCodeNum = -1;
                break;

            case Result.Canceled:
                resultCodeNum = 0;
                break;

            case Result.FirstUser:
                resultCodeNum = 1;
                break;
        }
        mCallbackManager.OnActivityResult(requestCode, resultCodeNum, data);
    }
}