首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Facebook认证的Xamarin.Droid防火墙

基于Facebook认证的Xamarin.Droid防火墙
EN

Stack Overflow用户
提问于 2017-06-20 17:28:14
回答 1查看 1.3K关注 0票数 1

经过几个小时的研究,我一直在努力把这件事做完。我已经做了进一步的和必要的改进,这就是我所拥有的。我能够成功登录,但我下一步要做的是让Firebase显示已登录的用户。这就是我几个小时以来一直在努力解决的问题。

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

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

谢谢。

代码语言:javascript
复制
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
                {


                }
            }
        }
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-21 08:37:49

我看到您尝试为您的IOnCompleteListener实现LoginActivity,但是我没有在代码中找到public void OnComplete(Task task),请确保您已经实现了Android.Gms.Tasks.IOnCompleteListener,如果这样做,您可以简单地将代码firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, new IOnCompleteListener<IAuthResult>());更改为firebaseAuth.SignInWithCredential(credential).AddOnCompleteListener(this, this);

下面是我的演示,它在我身边工作:

代码语言:javascript
复制
[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);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44659513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档