Сеанс: была предпринята попытка запросить новые разрешения для сеанса, который имеет ожидающий запрос.

Я хочу опубликовать историю через приложение для Android и использую приведенный ниже код.

    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
    private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
    private boolean pendingPublishReauthorization = false;
    private UiLifecycleHelper uiHelper;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uiHelper = new UiLifecycleHelper(XXActivity.this, callback);
        uiHelper.onCreate(savedInstanceState);
        setContentView(R.layout.layoutAct);
            ...
            ...
            ...
        publishAddCardStory();  
            ...         
    }

    @Override
    public void onResume() {
        super.onResume();
        Session session = Session.getActiveSession();
        if (session != null && (session.isOpened() || session.isClosed())) {
            onSessionStateChange(session, session.getState(), null);
        }
        uiHelper.onResume();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uiHelper.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }

    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }

     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putBoolean(PENDING_PUBLISH_KEY, pendingPublishReauthorization);
         uiHelper.onSaveInstanceState(outState);
     }



    private void publishAddCardStory() {
        Session session = initFacebookSession(PopupAddCardSuccessActivity.this);
        session = Session.getActiveSession();
        if (session != null){

            // Check for publish permissions    
            List<String> permissions = session.getPermissions();
            if (!isSubsetOf(PERMISSIONS, permissions)) {
                pendingPublishReauthorization = true;
                Session.NewPermissionsRequest newPermissionsRequest = new Session
                        .NewPermissionsRequest(this, PERMISSIONS);
            session.requestNewPublishPermissions(newPermissionsRequest);
                return;
            }

            Bundle params = new Bundle();
            ...
            params.putString("message", msg);
            params.putString("description", desc);
            params.putString("link", LINK);
                    ...


            Request.Callback callback= new Request.Callback() {
                public void onCompleted(Response response) {
                    JSONObject graphResponse = response
                                               .getGraphObject()
                                               .getInnerJSONObject();
                    String postId = null;
                    try {
                        postId = graphResponse.getString("id");
                    } catch (JSONException e) {
                        Log.i("FB-Response",
                            "JSON error "+ e.getMessage());
                    }
                    FacebookRequestError error = response.getError();
                    if (error != null) {
                        Toast.makeText(XXActivity.this
                             .getApplicationContext(),
                             getString(R.string.fb_post_fail),
                             Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(XXActivity.this
                                 .getApplicationContext(), 
                                 getString(R.string.fb_post_success),
                                 Toast.LENGTH_LONG).show();
                    }
                }
            };

            Request request = new Request(session, "me/feed", params, 
                                  HttpMethod.POST, callback);

            RequestAsyncTask task = new RequestAsyncTask(request);
            task.execute();
        }

    }

    private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
        for (String string : subset) {
            if (!superset.contains(string)) {
                return false;
            }
        }
        return true;
    }

    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) {
            //shareButton.setVisibility(View.VISIBLE);
        } else if (state.isClosed()) {
            //shareButton.setVisibility(View.INVISIBLE);
        }
    }


    private Session.StatusCallback callback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    };

    private static Session initFacebookSession(Context context) {
        Session session = Session.getActiveSession();
        if (session != null) 
            return session;

        if (session == null)
            session = new Session(context);
        return session;
    }

Когда-то я получил эти 2 ошибки ....

java.lang.UnsupportedOperationException: Session: была предпринята попытка запросить новые разрешения для сеанса, который имеет ожидающий запрос.

или когда-нибудь...

java.lang.UnsupportedOperationException: Session: была предпринята попытка запросить новые разрешения для сеанса, который в данный момент не открыт.

Любое предложение будет оценено.


person Vazedias    schedule 05.06.2013    source источник


Ответы (1)


Прежде всего, ваш метод initFacebookSession бесполезен, так как вы вызываете Session.getActiveSession() прямо под ним, поэтому вы можете удалить этот метод.

Затем вы должны обработать изменения SessionState в методе onSessionStateChange. Хотя вы этого не делаете, и единственное место, где вы вызываете метод publishAddCardStory, находится в onCreate, я предполагаю, что причина, по которой вы получаете эти ошибки, заключается в следующем:

  1. вы вызываете метод публикации в onCreate
  2. в методе публикации вы вызываете requestNewPermissions через сеанс, поэтому ваша активность будет уничтожена, а активность facebook с диалоговым окном, которое запрашивает разрешение на новые разрешения от пользователя, появляется, а сеанс переходит в состояние ожидания
  3. пользователь разрешит (или не разрешит) новые разрешения через диалог
  4. ваша активность создается снова, поэтому вы снова вызываете newPermissionsRequest через сеанс, пока сеанс все еще находится в состоянии ожидания, а onSessionStateChange еще не вызывался

Попробуйте просмотреть учебные пособия для разработчиков Facebook: https://developers.facebook.com/docs/android/scrumptious/ как обрабатывать изменения SessionState. Facebook SDK также предоставляет несколько примеров приложений, которые также могут оказаться полезными. Удачи! :)

person Luboš Staráček    schedule 09.09.2013