我有一个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);
}
不知道什么是错的。几天前工作了。有什么建议??