使用Android Facebook SDK中的共享对话框。如何知道用户实际共享了还是取消了共享活动?

使用Android Facebook SDK中的共享对话框。如何知道用户实际共享了还是取消了共享活动?,android,facebook,facebook-android-sdk,android-facebook,Android,Facebook,Facebook Android Sdk,Android Facebook,我已经向Android应用程序添加了共享功能,如下所述 但我注意到,如果用户被取消,则仍会调用共享活动onComplete @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestC

我已经向Android应用程序添加了共享功能,如下所述

但我注意到,如果用户被取消,则仍会调用共享活动
onComplete

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() {
        @Override
        public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
            Log.e("Activity", String.format("Error: %s", error.toString()));
        }

        @Override
        public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
            Log.e("Activity", "Success!");
        }
    });
}
我还查看了退回的包裹。即使我取消共享对话框,我也会得到

com.facebook.platform.extra.DID_COMPLETE=true
我如何才能得到用户在facebook上真正共享数据的结果?(无需使用facebook按钮单独登录。可能需要添加一些权限?

请参阅

您可以通过呼叫来判断用户是否已取消

String gesture = FacebookDialog.getNativeDialogCompletionGesture(data);
if (gesture != null) {
  if ("post".equals(gesture)) {
    // the user hit Post
  } else if ("cancel".equals(gesture)) {
    // the user hit cancel
  } else {
    // unknown value
  }
} else {
  // either an error occurred, or your app has never been authorized
}

其中数据是结果包。但是,仅当用户通过您的应用程序登录(即您至少拥有基本信息权限)时,才会返回非空值。如果用户从未登录或授权过你的应用程序,那么你唯一能看到的就是DID_完成,除非发生错误,否则它将始终为真。这是出于设计。

为了获得共享结果,您的应用程序至少需要具有“基本信息”权限

要解决此问题,只需打开一个会话(这将自动请求基本信息权限):

您可以在此处找到更多信息:

当用户在facebook上发帖时,
data.getString(“com.facebook.platform.extra.COMPLETION\u手势”)的值是“post”。

使用以下代码:-

/**
 * Facebook Dialog Callback 
 * 
 * Called up when come back from Share Dialog
 * 
 */
private class FacebookDialogCallBack implements FacebookDialog.Callback
{
    @Override
    public void onComplete(PendingCall pendingCall, Bundle data) 
    {
        //Show Toast Message
        showToastMessage(data);
    }

    @Override
    public void onError(PendingCall pendingCall, Exception error, Bundle data) 
    {
        //Show Toast Message
        showToastMessage(data);
    }
}
//Show Toast Message
private void showToastMessage(Bundle data)
{
    //Get Native Dialog Did Complete
    boolean didComplete = FacebookDialog.getNativeDialogDidComplete(data);

    if(didComplete)
    {
        //Get Native Dialog Completion Gesture
        String nativeDialogCompletionGesture = FacebookDialog.getNativeDialogCompletionGesture(data);

        if (nativeDialogCompletionGesture == null || FacebookDialog.COMPLETION_GESTURE_CANCEL.equals(nativeDialogCompletionGesture))
        {
            //Show Publish Cancel Toast
            UIUtil.showToast(R.string.toast_message_share_publish_cancelled);                                               
        }
        else
        {
            //Show Success Post Toast
            UIUtil.showToast(R.string.toast_message_share_success_post);
        }
    }
    else
    {
        //Show Publish Cancel Toast
        UIUtil.showToast(R.string.toast_message_share_publish_cancelled);
    }
}
标题##私有静态ShareDialog ShareDialog; 私有静态FacebookCallback shareCallback=新FacebookCallback(){ @凌驾 公开作废{ Log.d(“HelloFacebook”,“已取消”); } @凌驾 public void onError(facebook异常错误){ Log.d(“HelloFacebook”,String.format(“错误:%s”,错误.toString())); 字符串标题=this.getActivty().getString(R.String.error); 字符串alertMessage=error.getMessage(); showResult(标题、alertMessage); } @凌驾 成功时公开作废(共享结果){ Log.d(“HelloFacebook”,“Success!”); // 不为空,才分享成功 if(result.getPostId()!=null){ String title=this.getActivty().getString(R.String.success); String id=result.getPostId(); String alertMessage=this.getactivity().getString(R.String.successfully\u post\u post,id); showResult(标题、alertMessage); } } 私有void showResult(字符串标题、字符串警报消息){ 新建AlertDialog.Builder(this.getActivty()) .setTitle(标题) .setMessage(alertMessage) .setPositiveButton(R.string.ok,null) .show(); } }; 创建时受保护的void(Bundle savedInstanceState) { shareDialog=新建shareDialog(this.getActivty()); registerCallback(callbackManager,shareCallback); }
实现
facebook回调
,以了解共享是否成功或取消,或者是否存在错误

您也可以在活动和片段中使用下面的代码。在片段中使用时,请确保在ShareDialog构造函数中传递
。如果传递
getActivity()
,则不会在片段中触发
onActivityResult
方法

private CallbackManager callbackManager;

private void shareYourContentOnFacebook() {

    callbackManager = CallbackManager.Factory.create();
    ShareDialog shareDialog = new ShareDialog(this);
    shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() {
        @Override
        public void onSuccess(Sharer.Result result) {
            Log.d(this.getClass().getSimpleName(), "shared successfully");
            //add your code to handle successful sharing
        }

        @Override
        public void onCancel() {
            Log.d(this.getClass().getSimpleName(), "sharing cancelled");
            //add your code to handle cancelled sharing

        }

        @Override
        public void onError(FacebookException error) {
            Log.d(this.getClass().getSimpleName(), "sharing error");
            //add your code to handle sharing error

        }
    });

    if (ShareDialog.canShow(ShareLinkContent.class)) {

        ShareLinkContent shareLinkContent = new ShareLinkContent.Builder()
                .setContentTitle("Your content title")
                .setContentDescription("Your content description")
                .setContentUrl(Uri.parse(""http://your-content-url.com""))
                .build();

        shareDialog.show(shareLinkContent);

    }

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}
private CallbackManager CallbackManager;
私有void shareYourContentOnFacebook(){
callbackManager=callbackManager.Factory.create();
ShareDialog ShareDialog=新建ShareDialog(此);
registerCallback(callbackManager,newfacebookcallback()){
@凌驾
成功时公开作废(共享结果){
Log.d(this.getClass().getSimpleName(),“已成功共享”);
//添加代码以处理成功共享
}
@凌驾
公开作废{
Log.d(this.getClass().getSimpleName(),“共享已取消”);
//添加代码以处理取消的共享
}
@凌驾
public void onError(facebook异常错误){
Log.d(this.getClass().getSimpleName(),“共享错误”);
//添加代码以处理共享错误
}
});
if(ShareDialog.canShow(ShareLinkContent.class)){
ShareLinkContent ShareLinkContent=新的ShareLinkContent.Builder()
.setContentTitle(“您的内容标题”)
.setContentDescription(“您的内容描述”)
.setContentUrl(Uri.parse(“”)http://your-content-url.com""))
.build();
shareDialog.show(shareLinkContent);
}
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
callbackManager.onActivityResult(请求代码、结果代码、数据);
}

我刚刚试用了3.6,它似乎对我很管用。Scrumpious应用程序在其回调中使用此机制。如果集成了Facebook登录,则该机制将起作用,否则(例如,仅使用Facebook共享对话框)GetNativeDialogCompletionSirter()返回null。请查看我在回答中链接的文档。仅当用户已通过您的应用程序登录(即至少授予您的应用程序读取权限)时,完成手势才可用。这是预期的行为。我知道,但在以前版本的Facebook Sdk上,即使用户未登录,完成手势也可用。该手势仅适用于用户授予权限的应用。如何使用此代码?在我的AS中无法识别facebookdialog.callback。它的红色下划线。没有显示进口标志
/**
 * Facebook Dialog Callback 
 * 
 * Called up when come back from Share Dialog
 * 
 */
private class FacebookDialogCallBack implements FacebookDialog.Callback
{
    @Override
    public void onComplete(PendingCall pendingCall, Bundle data) 
    {
        //Show Toast Message
        showToastMessage(data);
    }

    @Override
    public void onError(PendingCall pendingCall, Exception error, Bundle data) 
    {
        //Show Toast Message
        showToastMessage(data);
    }
}
//Show Toast Message
private void showToastMessage(Bundle data)
{
    //Get Native Dialog Did Complete
    boolean didComplete = FacebookDialog.getNativeDialogDidComplete(data);

    if(didComplete)
    {
        //Get Native Dialog Completion Gesture
        String nativeDialogCompletionGesture = FacebookDialog.getNativeDialogCompletionGesture(data);

        if (nativeDialogCompletionGesture == null || FacebookDialog.COMPLETION_GESTURE_CANCEL.equals(nativeDialogCompletionGesture))
        {
            //Show Publish Cancel Toast
            UIUtil.showToast(R.string.toast_message_share_publish_cancelled);                                               
        }
        else
        {
            //Show Success Post Toast
            UIUtil.showToast(R.string.toast_message_share_success_post);
        }
    }
    else
    {
        //Show Publish Cancel Toast
        UIUtil.showToast(R.string.toast_message_share_publish_cancelled);
    }
}
    private static FacebookCallback<Sharer.Result> shareCallback = new FacebookCallback<Sharer.Result>() {
        @Override
        public void onCancel() {
            Log.d("HelloFacebook", "Canceled");
        }

        @Override
        public void onError(FacebookException error) {
            Log.d("HelloFacebook", String.format("Error: %s", error.toString()));
            String title = this.getActivty().getString(R.string.error);
            String alertMessage = error.getMessage();
            showResult(title, alertMessage);
        }

        @Override
        public void onSuccess(Sharer.Result result) {
            Log.d("HelloFacebook", "Success!");
            // 不为空,才分享成功
            if (result.getPostId() != null) {
                String title = this.getActivty().getString(R.string.success);
                String id = result.getPostId();
                String alertMessage = this.getActivty().getString(R.string.successfully_posted_post, id);
                showResult(title, alertMessage);
            }
        }

        private void showResult(String title, String alertMessage) {
            new AlertDialog.Builder(this.getActivty())
                    .setTitle(title)
                    .setMessage(alertMessage)
                    .setPositiveButton(R.string.ok, null)
                    .show();
        }
    };

protected void onCreate (Bundle savedInstanceState)
{
             shareDialog = new ShareDialog(this. getActivty());
             shareDialog.registerCallback( callbackManager, shareCallback);
}
private CallbackManager callbackManager;

private void shareYourContentOnFacebook() {

    callbackManager = CallbackManager.Factory.create();
    ShareDialog shareDialog = new ShareDialog(this);
    shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() {
        @Override
        public void onSuccess(Sharer.Result result) {
            Log.d(this.getClass().getSimpleName(), "shared successfully");
            //add your code to handle successful sharing
        }

        @Override
        public void onCancel() {
            Log.d(this.getClass().getSimpleName(), "sharing cancelled");
            //add your code to handle cancelled sharing

        }

        @Override
        public void onError(FacebookException error) {
            Log.d(this.getClass().getSimpleName(), "sharing error");
            //add your code to handle sharing error

        }
    });

    if (ShareDialog.canShow(ShareLinkContent.class)) {

        ShareLinkContent shareLinkContent = new ShareLinkContent.Builder()
                .setContentTitle("Your content title")
                .setContentDescription("Your content description")
                .setContentUrl(Uri.parse(""http://your-content-url.com""))
                .build();

        shareDialog.show(shareLinkContent);

    }

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}