Поискайте допълнително разрешение за 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 се изпълнява, но след това никога не се извиква обратно извикване, така че отменения call() няма да продължи, както и 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 вече се използва в него и би било странно да се добави lib, за да възпрепятства този работен процес на requestNewPermission - не искам да създавам повече бъркотия в структурата на проекта, има стига вече)   -  person Den Drobiazko    schedule 27.06.2014
comment
Разгледайте пробата Hello Facebook или пробата Scrumptious. И двете са добри примери за това как да поискате последващи разрешения за публикуване след първоначално влизане.   -  person Ming Li    schedule 27.06.2014
comment
Прегледах го. Коригирах кода си, за да бъде възможно най-сходен. Все още не работи: в onCreate сесията за обратно извикване се присвоява на uiHelper, методът call() на calback се извиква, след което се извиква onSessionStateChange. След като поискам и дам разрешение - onResume get се извиква, onActivityResult - и това е всичко. Дори се опитах да вляза в метода на Facebook, но се изгубих и уплаших. Тези момчета от fb оставят коментари и 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