私は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はアクセストークンを持っているとみなされます。この問題の原因は何ですか?