Xamarin.Android Facebook原生登录

时间:2015-12-23 10:57:49

标签: android facebook xamarin facebook-sdk-4.0

我有一个Xamarin.Android应用程序FB原生登录工作几天,但现在它已经全部破产。它在Genymotion上运行顺畅,但在设备上,显示Facebook应用程序身份验证需要花费很多时间,最糟糕的是,当它返回时,没有任何反应。页面仍然像点击FB按钮之前一样。 以下是代码段:

初​​始化:

[assembly:MetaData(" com.facebook.sdk.ApplicationId",Value =" @ string / app_id")]

[assembly:MetaData(" com.facebook.sdk.ApplicationName",Value =" @ string / app_name")]

内部TaskCompletionSource FacebookLoginTask = new TaskCompletionSource();

然后在Oncreate中:

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

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        #region Fb Native Login
        FacebookSdk.SdkInitialize (this.ApplicationContext);
        callbackManager = CallbackManagerFactory.Create ();

        FacebookLoginTask = new TaskCompletionSource<string> ();

        var loginCallback = new FacebookCallback<LoginResult> {
            HandleSuccess = loginResult => FacebookLoginTask.SetResult (loginResult.AccessToken.Token),
            HandleCancel = FacebookLoginTask.SetCanceled,
            HandleError = FacebookLoginTask.SetException
        };

        LoginManager.Instance.RegisterCallback (callbackManager, loginCallback);
        #endregion

        InitializeComponents ();
    }

在FB按钮上单击:

private async void btnFB_Onclick (object sender, EventArgs e)
    {
        //TODO : Set permission in global values
        if (AccessToken.CurrentAccessToken != null && !string.IsNullOrEmpty (AccessToken.CurrentAccessToken.Token)) {
            //LoginManager.Instance.LogOut ();
            LoginManager.Instance.LogInWithReadPermissions (this, new string[] {
                "user_birthday",
                "read_stream",
                "email",
                "user_location"
            });
            await GetAccessToken ();
        } else {
            LoginManager.Instance.LogInWithReadPermissions (this, new string[] {
                "user_birthday",
                "read_stream",
                "email",
                "user_location"
            });
            await GetAccessToken ();
        }

最后:

async Task GetAccessToken ()
    {
        try {
            IsContainEmail = true;
            string accessToken = string.Empty;
            if (AccessToken.CurrentAccessToken != null && !string.IsNullOrEmpty (AccessToken.CurrentAccessToken.Token))
                accessToken = AccessToken.CurrentAccessToken.Token;
            else {
                if (!ControllerHelper.IsOnline (this))
                    return;
                ActivityView = ProgressDialog.Show (this, "Please wait", "Authenticating...", true);
                accessToken = await FacebookLoginTask.Task;
//It does not fallback here
                Console.WriteLine (accessToken);
                try {
                    FacebookClient fb = new FacebookClient (accessToken);
                    var me = await fb.GetTaskAsync ("me");
                    var result = (IDictionary<string, object>)me;
                    Console.WriteLine (result.ToString ());
                    if (!result.ContainsKey ("email") || string.IsNullOrEmpty ((string)result ["email"])) {
                        IsContainEmail = false;
                    }
                    if (IsContainEmail) {
                        await CreateFBRegistration (result);
                    }
                    ActivityView.Dismiss ();
                    ActivityView.Dispose ();
                } catch (Exception e) {
                    IsContainEmail = false;
                    Console.WriteLine (e.Message);
                    ActivityView.Dismiss ();
                    ActivityView.Dispose ();
                }
            }
        } catch (Exception ex) {
            ActivityView.Dismiss ();
            ActivityView.Dispose ();
            Console.WriteLine (ex.Message);
        }
    }

它等待着FacebookLoginTask.Task;虽然我得到了回调:

//Must include to trigger the callback
    protected override void OnActivityResult (int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult (requestCode, resultCode, data);
        callbackManager.OnActivityResult (requestCode, (int)resultCode, data);
    }

不知道什么是错的。几天前工作了。有什么建议??

0 个答案:

没有答案