Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在Xamarin中使用Facebook android SDK共享帖子_Facebook_Xamarin.android - Fatal编程技术网

无法在Xamarin中使用Facebook android SDK共享帖子

无法在Xamarin中使用Facebook android SDK共享帖子,facebook,xamarin.android,Facebook,Xamarin.android,我正在使用Xamarin PCL项目类型制作一个应用程序。我已经在我的共享项目中创建了UI,即:在XAML中。当我使用Aap在Facebook上分享一些帖子时。我发现Xamarin for Common项目的Facebook SDK已经过时,FB也改变了政策。在谷歌搜索之后,我发现,我必须在各自的IOS和Driod项目中实现它 我创建了一个名为FBLoginCustomView的类,该类继承自按钮。 我已经在IOS和Droid中编写了渲染,并在共享项目的XAML中添加了自定义按钮,以便通过各自的

我正在使用Xamarin PCL项目类型制作一个应用程序。我已经在我的共享项目中创建了UI,即:在XAML中。当我使用Aap在Facebook上分享一些帖子时。我发现Xamarin for Common项目的Facebook SDK已经过时,FB也改变了政策。在谷歌搜索之后,我发现,我必须在各自的IOS和Driod项目中实现它

我创建了一个名为
FBLoginCustomView
的类,该类继承自
按钮
。 我已经在IOS和Droid中编写了渲染,并在共享项目的XAML中添加了自定义按钮,以便通过各自的渲染器在每个平台上使用“FaceBook登录按钮”

在IOS中,我成功地完成了整个周期

在Droid中,我能够成功登录Facebook并获得访问令牌。但无法分享帖子。我正在使用依赖项服务调用ShareApi。请查看以下代码:

渲染器:

[assembly: ExportRenderer(typeof(FBLoginCustomView), typeof(FBLoginRenderer))]
namespace MyProject.Android
{
    public class FBLoginRenderer : ViewRenderer<FBLoginCustomView, LoginButton>
    {

        LoginButton loginButton;

        protected override void OnElementChanged(ElementChangedEventArgs<FBLoginCustomView> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null)
            {
                return;
            }

            var loginCallback = new FacebookCallback<LoginResult>
            {
                HandleSuccess = loginResult =>
                {
                    var accessToken = loginResult.AccessToken;
                    var accessToken2 = AccessToken.CurrentAccessToken.Token;
                    AccessToken.CurrentAccessToken = accessToken;
                },
                HandleCancel = () =>
                {
                },
                HandleError = loginError =>
                {
                }
            };

            LoginManager.Instance.RegisterCallback(MainActivity.CallbackManager, loginCallback);

            loginButton = new LoginButton(Forms.Context);
            loginButton.LayoutParameters = new LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent);
            loginButton.SetToolTipMode(LoginButton.ToolTipMode.NeverDisplay);
            loginButton.LoginBehavior = LoginBehavior.NativeOnly;

            //var permissions = new List<string> { "public_profile", "email" };
            var permissions = new List<string> { "publish_actions"};

            //loginButton.SetReadPermissions(permissions);
            loginButton.SetPublishPermissions(permissions);
            loginButton.Click += (object sender, EventArgs ev) =>
            {
                var loginManager = LoginManager.Instance;
                loginManager.SetLoginBehavior(LoginBehavior.NativeOnly);
                if (loginManager != null)

                //if (AccessToken.CurrentAccessToken == null)
                    {
                        loginManager.LogInWithPublishPermissions(MainActivity.Instance(), permissions);

                        //loginManager.LogInWithReadPermissions(MainActivity.Instance(), permissions);

                    }
                    //loginManager.LogInWithReadPermissions(MainActivity.Instance(), permissions);
                };
            //loginButton.SetReadPermissions("public");

            SetNativeControl(loginButton);
        }

        public FBLoginRenderer()
        {
        }

    }

    class FacebookCallback<TResult> : Java.Lang.Object, IFacebookCallback where TResult : Java.Lang.Object
    {
        public Action HandleCancel { get; set; }
        public Action<FacebookException> HandleError { get; set; }
        public Action<TResult> HandleSuccess { get; set; }

        public void OnCancel()
        {
            var c = HandleCancel;
            if (c != null)
                c();
        }

        public void OnError(FacebookException error)
        {
            var c = HandleError;
            if (c != null)
                c(error);
        }

        public void OnSuccess(Java.Lang.Object result)
        {
            var c = HandleSuccess;
            if (c != null)
                c(result.JavaCast<TResult>());
        }
    }
}
[程序集:ExportRenderer(typeof(FBLoginCustomView)、typeof(FBLoginRenderer))]
名称空间MyProject.Android
{
公共类FBLoginRenderer:ViewRenderer
{
登录按钮登录按钮;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.OldElement!=null)
{
返回;
}
var loginCallback=新的facebook回调
{
HandleSuccess=loginResult=>
{
var accessToken=loginResult.accessToken;
var accessToken2=AccessToken.CurrentAccessToken.Token;
AccessToken.CurrentAccessToken=AccessToken;
},
HandleCancel=()=>
{
},
HandleError=登录错误=>
{
}
};
LoginManager.Instance.RegisterCallback(MainActivity.CallbackManager,loginCallback);
loginButton=新的loginButton(Forms.Context);
loginButton.LayoutParameters=新的LayoutParams(LayoutParams.WrapContent,LayoutParams.WrapContent);
设置工具提示模式(loginButton.ToolTipMode.NeverDisplay);
loginButton.LoginBehavior=LoginBehavior.NativeOnly;
//var permissions=新列表{“public_profile”,“email”};
var permissions=新列表{“发布操作”};
//SetReadPermissions(权限);
SetPublishPermissions(权限);
登录按钮。单击+=(对象发送者,事件参数ev)=>
{
var loginManager=loginManager.Instance;
loginManager.SetLoginBehavior(LoginBehavior.NativeOnly);
如果(loginManager!=null)
//if(AccessToken.CurrentAccessToken==null)
{
loginManager.LogInWithPublishPermissions(MainActivity.Instance(),权限);
//loginManager.LogInWithReadPermissions(MainActivity.Instance(),权限);
}
//loginManager.LogInWithReadPermissions(MainActivity.Instance(),权限);
};
//loginButton.SetReadPermissions(“public”);
SetNativeControl(登录按钮);
}
公共FBLoginRenderer()
{
}
}
类FacebookCallback:Java.Lang.Object,IFacebookCallback其中TResult:Java.Lang.Object
{
公共操作HandleCancel{get;set;}
公共操作句柄错误{get;set;}
公共操作HandleSuccess{get;set;}
公开作废
{
var c=手部癌症;
如果(c!=null)
c();
}
public void OnError(facebook异常错误)
{
var c=手柄错误;
如果(c!=null)
c(错误);
}
成功时的公共void(Java.Lang.Object结果)
{
var c=可操作的成功;
如果(c!=null)
c(result.JavaCast());
}
}
}
在此类中使用依赖项服务:

namespace MyProject.Android
{
    public class FBshare_Android : Java.Lang.Object, IFBShare, TextToSpeech.IOnInitListener
    {
        TextToSpeech speaker; string toSpeak;
        //FacebookCallback<SharerResult> shareCallback;

        public FBshare_Android () {}

        public bool SharePost(string text, Image img)
        {
            PostPhoto();
            return true;
        }

        private void PostPhoto()
        {
            try
            {
                var image = BitmapFactory.DecodeResource(null, Resource.Drawable.icon);
                var sharePhoto = new SharePhoto.Builder()
                    .SetBitmap(image).Build().JavaCast<SharePhoto>();

                var photos = new List<SharePhoto>();
                photos.Add(sharePhoto);

                var sharePhotoContent = new SharePhotoContent.Builder()
                    .SetPhotos(photos).Build();

                if (HasPublishPermission())
                    ShareApi.Share(sharePhotoContent, null);
            }
            catch (Exception exp)
            {
                SpeakToTest(exp.InnerException.ToString());
            }
        }

        bool HasPublishPermission ()
        {
            var accessToken = AccessToken.CurrentAccessToken;
            return accessToken != null && accessToken.Permissions.Contains("publish_actions");
        }
名称空间MyProject.Android
{
公共类FBshare\u Android:Java.Lang.Object、IFBShare、TextToSpeech.oninitListener
{
TextToSpeech扬声器;字符串toSpeak;
//FacebookCallback共享回调;
公共FBshare_Android(){}
公共bool SharePost(字符串文本、图像img)
{
后摄影();
返回true;
}
私人无效后照()
{
尝试
{
var image=BitmapFactory.DecodeResource(null,Resource.Drawable.icon);
var sharePhoto=new sharePhoto.Builder()
.SetBitmap(image.Build().JavaCast();
var photos=新列表();
照片。添加(共享照片);
var sharepotocontent=新的sharepotocontent.Builder()
.SetPhotos(photos.Build();
if(HasPublishPermission())
ShareApi.Share(sharePhotoContent,null);
}
捕获(异常扩展)
{
SpeakToTest(exp.InnerException.ToString());
}
}
布尔已发布许可()
{
var accessToken=accessToken.CurrentAccessToken;
return accessToken!=null&&accessToken.Permissions.Contains(“发布操作”);
}
在watch中检查CurrentAccessToken时,会出现一条消息,而不是写为:

[访问令牌已被删除,权限…]


一旦成功登录,API应该假设有访问令牌。是什么导致了这个问题?

我已经为twitter和fb实现了共享

Android版本

您可以使用本机,如果不可用,则使用OAuth2Authenticator获取访问tok
public void ShareViaSocial(string serviceType, string urlToShare)
        {
            ShareDialog di = new ShareDialog(MainActivity.Instance);
             var facebookShareContent = new ShareLinkContent.Builder();
             facebookShareContent.SetContentUrl(Android.Net.Uri.Parse(urlToShare));
            if (serviceType == "Facebook")
            {
                if (di.CanShow(facebookShareContent.Build(), ShareDialog.Mode.Automatic))
                {
                    di.Show(facebookShareContent.Build());
                }
                else
                {
                    var auth = new OAuth2Authenticator(
                    clientId: 'ClientId',
                    scope: "public_profile,publish_actions",
                    authorizeUrl: new Uri("https://m.facebook.com/dialog/oauth/"),
                    redirectUrl: new Uri( "http://www.facebook.com/connect/login_success.html"));

                    MainActivity.Instance.StartActivity(auth.GetUI(MainActivity.Instance.ApplicationContext));

                    auth.AllowCancel = true;
                    auth.Completed += (s, e) =>
                    {
                        if (e.IsAuthenticated)
                        {
                            Account fbAccount = e.Account;
                            Dictionary<string, string> dictionaryParameters = new Dictionary<string, string>() { { "link", urlToShare } };
                            var requestUrl = new Uri("https://graph.facebook.com/me/feed");
                            var request = new OAuth2Request(SharedConstants.requestMethodPOST, requestUrl, dictionaryParameters, fbAccount);

                            request.GetResponseAsync().ContinueWith(this.requestResult);
                        }
                        else { OnShare(this, ShareStatus.NotSuccessful); }
                    };
                    auth.Error += Auth_Error;
                }
            }

            else
            {
                var auth = new OAuth1Authenticator(
                               'TwitterConsumerKey',
                               'TwitterConsumerSecret',
                               new Uri("https://api.twitter.com/oauth/request_token"),
                               new Uri("https://api.twitter.com/oauth/authorize"),
                               new Uri("https://api.twitter.com/oauth/access_token"),
                               new Uri('TwitterCallBackUrl'));

                auth.AllowCancel = true;
                // auth.ShowUIErrors = false;
                // If authorization succeeds or is canceled, .Completed will be fired.
                auth.Completed += (s, e) =>
                {
                    // We presented the UI, so it's up to us to dismiss it.

                    if (e.IsAuthenticated)
                    {
                        Account twitterAccount = e.Account;
                        Dictionary<string, string> dictionaryParameters = new Dictionary<string, string>() { { "status", urlToShare } };
                        var request = new OAuth1Request(SharedConstants.requestMethodPOST, new Uri("https://api.twitter.com/1.1/statuses/update.json"), dictionaryParameters, twitterAccount);
                        //for testing var request = new OAuth1Request("GET",new Uri("https://api.twitter.com/1.1/account/verify_credentials.json "),null, twitterAccount);
                        request.GetResponseAsync().ContinueWith(this.requestResult);
                    }
                    else { OnShare(this, ShareStatus.NotSuccessful); }
                };
                auth.Error += Auth_Error;
                //auth.IsUsingNativeUI = true;
                MainActivity.Instance.StartActivity(auth.GetUI(MainActivity.Instance.ApplicationContext));
            }


        }