android - Xamarin Forms 和 Facebook Android SDK 问题

标签 android xamarin facebook-android-sdk xamarin.forms facebook-access-token

我正在使用 Parse 后端开发 Xamarin.Forms 应用程序。我正在尝试集成Facebook Android SDK进入那个。我想要做的是在每个设备上获取 native 访问 token ,并将该访问 token 推送到 Parse.com。为此,我需要使用 Xamarin 的官方 facebook sdk 绑定(bind)。我为此使用依赖注入(inject)。所以我有 IFacebookService

public interface IFacebookService
{
    Task<string> GetFacebookToken();
    void LogOut();
}

在每个平台上,我实现 FacebookService 并注入(inject)该实现。在 iOS 上我没有遇到任何问题。在 Android 上,问题是即使显示了 facebook UI,我也没有在 FacebookService 的实现中收到回调。我认为这与 Android 如何管理回调以及 Xamarin.Forms 如何创建 Activity 有关。让我看一下代码。以下是请求 Facebook 登录的代码部分

var callbackManager = CallbackManagerFactory.Create();
//Here I instantiate my own implementation of IFacebookCallback
//nothing fancy here, I've just implemented the required methods with Console.WriteLine();
var loginCallback = new FacebookCallback(() => _loginInProgress = false);
//Register callbackManager and my instance of loginCallback
LoginManager.Instance.RegisterCallback (callbackManager, loginCallback);
//Here is the important part. I need an activity to show the login UI
//Xamarin forms provides me with this method.
var activity = Xamarin.Forms.Forms.Context as Activity;
//I request login
LoginManager.Instance.LogInWithReadPermissions(activity, new string[] { "public_profile", "email", "user_friends" });

所以,我相信问题出在这一行

var activity = Xamarin.Forms.Forms.Context as Activity;

在调试器中,我看到返回了 MainActivity,这是我的入口点 (MainLauncher = true),也是我调用 Xamarin Form 初始化方法的地方

//Setup Xamarin forms
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new FormsApp());

在 FormsApp 中注册的初始页面称为 LoginPage。所以我相信它是作为主 Activity 中的 fragment 加载的。所以,也许我需要做这样的事情

LoginManager.Instance.LogInWithReadPermissions(LOGIN_PAGE_FRAGMENT,......);

因为在fa​​cebook sdk中,activity和fragment有单独的版本。我不知道如何获取LOGIN_PAGE_FRAGMENT,甚至问题可能出在其他地方,我不明白。 您有什么想法会导致该问题吗?

最佳答案

我已经解决了这个问题!我发现了类似的东西 here 虽然我的方法有点不同,但主要问题是我需要将 OnActivityResult 的实现添加到 MainActivity 中,并在 MainActivity 内创建 CallbackManager 并委托(delegate) >OnActivityResult 到该 CallbackManager。所以在 MainActivity 中我添加了这个属性

public ICallbackManager CallbackManager { get; private set; } 

然后我像这样重写了OnActivityResult

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    CallbackManager.OnActivityResult(requestCode, (int)resultCode, data);
}

然后我用这个替换了之前的登录代码

var loginCallback = new FacebookCallback(() => _loginInProgress = false);
var activity = Xamarin.Forms.Forms.Context as MainActivity;
LoginManager.Instance.RegisterCallback (activity.CallbackManager, loginCallback);
LoginManager.Instance.LogInWithReadPermissions(activity, new string[] { "public_profile", "email", "user_friends" });

一切顺利!希望这会对某人有所帮助。

关于android - Xamarin Forms 和 Facebook Android SDK 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32776463/

相关文章:

android - scanCallback 如何用于蓝牙设备?

xaml - NavigationPage 作为 XAML 中 TabbedPage 的子级

c# - Xamarin.Android - typeof 和 GetType 始终返回 System.RuntimeType

android - 如何从 Facebook SDK 3.0 获取好友列表

java - 设置请求优先级 Volley

java - 安卓 : Object retrieved from Service is null after binding service as well

android facebook post api 不工作

android - 如何在 graph api 中将 facebook 访问 token 用作字符串

android - 您如何在 Android 上设置人行横道以从本地外部存储加载文件?

c# - Azure 应用服务 - 自定义身份验证 - 不允许 HTTP 动词