2017-01-27 20 views
0

私はXamarin PCLプロジェクトタイプを使用してアプリケーションを作成しています。共有プロジェクトでUIを作成しました。つまり、XAMLで。自分のAAPを使ってFacebookに投稿を投稿しました。 Xamarin for CommonプロジェクトのFacebook SDKがリリースされ、FBがポリシーを変更したことが判明しました。グーグルで調べたところ、IOSとDriodのそれぞれのプロジェクトで実装する必要があることが分かった。XamarinのFacebookアンドロイドSDKを使用して投稿を共有できません

Buttonから継承したFBLoginCustomViewという名前のクラスを作成しました。 私はIOSとDroidの両方でレンダリングを書いており、それぞれのレンダラを介して各プラットフォームで 'FaceBook Login Button'を使うために、私の共有プロジェクトのXAMLにカスタムボタンを追加しました。

IOSでは、私はサイクル全体を正常に完了しました。

ドロイドでは、Facebookにログインしてアクセストークンを取得できました。しかし、投稿を共有することはできません。 Dependency Serviceを使用して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>()); 
     } 
    } 
} 

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"); 
     } 

を時計にCurrentAccessTokenをチェックすると、Theresのように書か代わりにトークンのメッセージ:

[アクセストークンが削除され、アクセス許可.....]

一度正常にログインすると、APIはアクセストークンを持っているとみなされます。この問題の原因は何ですか?

答えて

0

twitterとfbの共有を実装しました。

Androidのバージョン

あなたはネイティブfacebook ShareDialogを使用することができますし、場合には、Twitter上でポーズためFB graph を使用してOAuth1Authenticatorを使用して投稿し、次にアクセストークンを取得するために利用できる利用OAuth2Authenticatorではありません

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)); 
      } 


     } 
関連する問題