Использование диалога общего доступа в Android Facebook SDK. Как узнать, действительно ли пользователь поделился или отменил действие общего доступа?

Я добавил функцию обмена в приложение для Android, как описано здесь https://developers.facebook.com/docs/android/share-dialog/#setup

Но я заметил, что если пользователь отменяет действие совместного использования, 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!");
        }
    });
}

Я также заглянул в Bundle, который вернулся. Даже если я отменю диалоговое окно общего доступа, я получаю

com.facebook.platform.extra.DID_COMPLETE=true

Как я могу получить результат, что пользователь действительно поделился данными на facebook? (Не делая отдельный вход с помощью кнопки facebook. Может быть, нужно добавить какие-то разрешения?)


person Elizaveta Ivanova    schedule 02.11.2013    source источник


Ответы (6)


См. https://developers.facebook.com/docs/android/share-dialog/#handling-responses

Вы можете узнать, отменил ли пользователь вызов

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
}

где данные - это пакет результатов. Однако он вернет ненулевое значение только в том случае, если пользователь вошел в систему через ваше приложение (т. е. у вас есть как минимум права доступа basic_info). Если пользователь никогда не входил в систему и не авторизовал ваше приложение, единственное, что вы увидите, это DID_COMPLETE, и это всегда будет верно, если не произойдет ошибка. Это по дизайну.

person Ming Li    schedule 04.11.2013
comment
Я только что попробовал с 3.6, и у меня, кажется, все работает нормально. Приложение Scrumptious использует этот механизм в своем обратном вызове. - person Ming Li; 11.12.2013
comment
Это будет работать, если вход в Facebook интегрирован, в противном случае (например, используйте только диалоговое окно общего доступа к Facebook) getNativeDialogCompletionGesture() возвращает значение null. - person Wayne; 12.12.2013
comment
Пожалуйста, ознакомьтесь с документами, на которые я ссылался в ответе. Жест завершения доступен ТОЛЬКО, если пользователь уже вошел в систему через ваше приложение (т. е. предоставил вашему приложению как минимум права на чтение). Это ожидаемое поведение. - person Ming Li; 12.12.2013
comment
Я знаю, но в предыдущей версии Facebook Sdk жест завершения доступен, даже если пользователь не вошел в систему. - person Wayne; 12.12.2013
comment
Им не нужно в настоящее время входить в систему, им просто нужно авторизовать ваше приложение в какой-то момент в прошлом (и еще не удалить ваше приложение). Это поведение не изменилось между выпусками. - person Ming Li; 12.12.2013
comment
Перед обновлением до версии SDK 3.6 я могу использовать getNativeDialogCompletionGesture для проверки действий пользователя (поделиться или отменить), даже когда я просто использую диалог общего доступа без авторизации, но теперь требуется авторизация. - person Wayne; 13.12.2013
comment
Я могу публиковать, но для меня всегда возвращается ноль, не имеет значения, отменил ли я или был ли пост успешным... почему? - person JHNeves; 27.03.2014
comment
Этот жест доступен только для приложений, которым пользователь предоставил разрешения. - person Ming Li; 28.03.2014
comment
Ссылка вверху уже не работает. Это правильная ссылка: developers.facebook.com/docs/android/ - person Shygar; 12.07.2014

Чтобы получить результат для обмена, ваше приложение должно иметь как минимум разрешение basic_info.

Чтобы решить эту проблему, просто откройте сеанс (это автоматически запросит разрешение basic_info):

Session.openActiveSession(this /*your activity*/, 
                          true /*allows the UI login to show up if needed*/, 
                          new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        Log.i("[Facebook]", "Session: " + state.toString());
        if (session.isOpened()) {
           /// now you are good to get the sharing results
        }
    }
});

Дополнительную информацию можно найти здесь: https://developers.facebook.com/docs/android/getting-started/

person JHNeves    schedule 27.03.2014

Реализуйте FacebookCallback<Sharer.Result>, чтобы узнать, был ли общий доступ успешным или отмененным, или произошла ошибка.

Вы можете использовать приведенный ниже код в Activity и во Fragment. При использовании во фрагменте убедитесь, что вы передаете this в конструкторе 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);
}
person dzikovskyy    schedule 18.08.2016

@Override
public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
    if (data.getString("com.facebook.platform.extra.COMPLETION_GESTURE").equals("cancel"))
        return;
}

значение data.getString("com.facebook.platform.extra.COMPLETION_GESTURE") равно "post", когда пользователь размещал сообщения на Facebook.

person Rony Tesler    schedule 19.05.2014

Используйте этот код: -

/**
 * 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);
    }
}
person Himanshu Narang    schedule 23.12.2014
comment
как использовать этот код? facebookdialog.callback не распознается моей AS. подчеркнуто красным. и не отображается знак импорта - person Goofy_Phie; 04.07.2017

Заголовок ## private static ShareDialog shareDialog;

    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);
}
person Change    schedule 25.12.2015