Запросить дополнительное разрешение facebook

У меня возникли проблемы при попытке получить дополнительное разрешение «publish_action».

Я предполагаю, что пользователь уже вошел в систему через facebook, поэтому основные разрешения предоставлены. Тогда у меня есть этот код (из моего фрагмента):

List<String> permissionsRequested = Arrays.asList("publish_actions");
List<String> permissionsActual = session.getPermissions();
if (!isSubsetOf(permissionsRequested,  permissionsActual)) {
    pendingPublishReauthorization = true;
    Session.NewPermissionsRequest newPermissionsRequest = new Session
        .NewPermissionsRequest(this, permissionsRequested);
    session.requestNewPublishPermissions(newPermissionsRequest);
    return;
}

Судя по отладке, после того, как пользователь предоставил разрешение, управление переходит к onActivityResult, где, согласно документам facebook, у меня есть

super.onActivityResult(requestCode, resultCode, data);
facebookUiHelper.onActivityResult(requestCode, resultCode, data);

uiHelper также правильно (согласно документам) используется во всех этих методах onResume и onDestroy.

В onCreate у меня есть

super.onCreate(savedInstanceState);
facebookUiHelper = new UiLifecycleHelper(getActivity(), fbSessionCallback);
facebookUiHelper.onCreate(savedInstanceState);

где fbSessionCallback переопределил метод call(), который вызывает мой onFbSessionRestore():

if (pendingPublishReauthorization && 
    state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
    pendingPublishReauthorization = false;
    // do things with my new session, updated with granted permission. e.g. post to fb.
}

Проблема в том, что

  1. onActivityResult выполняется, но после этого обратный вызов никогда не вызывался, поэтому переопределенный вызов() не будет выполняться, как и onFbSessionCallback.
  2. Если я попытаюсь опубликовать снова (начать все с нуля) после этого - он снова получит сеанс без предоставленного разрешения, попытается запросить его, а затем выйдет исключение facebook о ожидающем разрешении newPublishRequest, бла-бла

Может ли кто-нибудь помочь настроить рабочий процесс из onActivityResult и более поздних версий? Я читаю документы facebook и склонен обвинять их в том, что они написаны плохо. Может это я просто тупой... :(((


person Den Drobiazko    schedule 27.06.2014    source источник
comment
Я думаю, вам нужно проверить github.com/sromku/android-simple-facebook, который может быть простым способом интегрировать facebook sdk в ваш проект.   -  person Haresh Chhelana    schedule 27.06.2014
comment
К сожалению, это, скорее всего, не вариант для этого проекта.   -  person Den Drobiazko    schedule 27.06.2014
comment
Я имею в виду - я не единственный, кто работает над этим проектом, facebook API уже используется во всем нем, и было бы странно добавлять библиотеку для реализации этого рабочего процесса requestNewPermission - не хочу создавать больше беспорядка в структуре проекта, есть уже достаточно )   -  person Den Drobiazko    schedule 27.06.2014
comment
Взгляните на образец Hello Facebook или образец Scrumptious. Оба являются хорошими примерами того, как запрашивать последующие разрешения на публикацию после первоначального входа в систему.   -  person Ming Li    schedule 27.06.2014
comment
Просмотрел его. Скорректировал мой код, чтобы он был максимально похож. Все еще не работает: в сеансе onCreate обратный вызов назначается uiHelper, вызывается метод обратного вызова(), затем вызывается метод onSessionStateChange. После того, как я запрашиваю и даю разрешение - вызывается onResume get, onActivityResult - и все. Я даже пытался зайти в метод facebooks, но потерялся и испугался. Эти ребята из фб оставляют комментарии и javadocs только для публичных методов (((   -  person Den Drobiazko    schedule 01.07.2014


Ответы (1)


Вот как я это настроил:

Session session = Session.getActiveSession();
    if (session != null) {
        List<String> permissions = session.getPermissions();
        if (!permissions.contains("publish_actions")) {
            Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, "publish_actions");
            session.addCallback(callbacktwo);
            session.requestNewPublishPermissions(newPermissionsRequest);
            return;
        }
    }

Это в моем onActivityResult, но это не обязательно. Я использовал его в своем onCreate раньше. Я добавил обратный вызов к запросу, который затем могу использовать для выполнения следующего шага.

Вот мой обратный вызов:

private Session.StatusCallback callbacktwo = new Session.StatusCallback() {

    @Override
    public void call(Session session, SessionState state, Exception exception) {
        Intent in = new Intent(getActivity(), ClassHere.class);
        startActivity(in);
    }
};

Помните, что обратный вызов будет отвечать дважды: один раз при запуске запроса на разрешение и после его завершения. Таким образом, вы должны обойти это/встроить это в свой код.

person RED_    schedule 27.06.2014
comment
Нет, у меня вообще не работает. call() в экземпляре Session.StatusCallback никогда не вызывается. - person Den Drobiazko; 27.06.2014