java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that has a pending request

StackOverflow https://stackoverflow.com/questions/14788938

Question

Below code is for posting status update using facebookSDK3.0 in android. If I'm using UiLifeCycleHelper class its working well. But I want to post the status in facebook without using UiLifeCycleHelper class. I tried the below code, which throws error in my logcat and my application is forced closed.

public class SampleFBPostActivity extends Activity implements OnClickListener {

private EditText mPostEditText;
private Button mDoneButton;
private Session mSession;
private PendingAction pendingAction = PendingAction.NONE;

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
private enum PendingAction {
    NONE,
    POST_STATUS_UPDATE
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fb_post);
    mPostEditText = (EditText) findViewById(R.id.post_text);
    mDoneButton = (Button) findViewById(R.id.done_button);
    mDoneButton.setOnClickListener(this);
    mSession = Session.getActiveSession();
    if (mSession == null) {
        mSession = new Session(this);
        Session.setActiveSession(mSession);
    }
    updateUI();
    handlePendingAction();
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.done_button:
        onClickPostStatusUpdate();
        break;
    }
}

 private interface GraphObjectWithId extends GraphObject {
        String getId();
    }

 private void showPublishResult(String message, GraphObject result, FacebookRequestError error) {
        String title = null;
        String alertMessage = null;
        if (error == null) {
            title = getString(R.string.success);
            String id = result.cast(GraphObjectWithId.class).getId();
            alertMessage = getString(R.string.successfully_posted_post, message, id);
        } else {
            title = getString(R.string.error);
            alertMessage = error.getErrorMessage();
        }

        new AlertDialog.Builder(this)
                .setTitle(title)
                .setMessage(alertMessage)
                .setPositiveButton(R.string.ok, null)
                .show();
    }

    private void onClickPostStatusUpdate() {
        performPublish(PendingAction.POST_STATUS_UPDATE);
    }

    private void postStatusUpdate(final String message) {
        if (mSession != null && hasPublishPermission()) {
            Request request = Request
                    .newStatusUpdateRequest(Session.getActiveSession(), message, new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            showPublishResult(message, response.getGraphObject(), response.getError());
                        }
                    });
            request.executeAsync();
        } else {
            pendingAction = PendingAction.POST_STATUS_UPDATE;
        }
    }

    private boolean hasPublishPermission() {
        Session session = Session.getActiveSession();
        return session != null && session.getPermissions().contains("publish_actions");
    }

    private void performPublish(PendingAction action) {
        Session session = Session.getActiveSession();
        if (session != null) {
            pendingAction = action;
            if (hasPublishPermission()) {
                handlePendingAction();
            } else {
                session.requestNewPublishPermissions(new Session.NewPermissionsRequest(this, PERMISSIONS));
            }
        }
    }

private void updateUI() {
    Session session = Session.getActiveSession();
    boolean enableButtons = (session != null && session.isOpened());
    mDoneButton.setEnabled(enableButtons);
}

 private void handlePendingAction() {
        PendingAction previouslyPendingAction = pendingAction;
        pendingAction = PendingAction.NONE;

        switch (previouslyPendingAction) {

            case POST_STATUS_UPDATE:
                postStatusUpdate(mPostEditText.getText().toString());
                break;
        }
    }
}

Below is the error in the logcat :

  02-09 14:00:36.126: E/AndroidRuntime(2396): java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that has a pending request.
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at com.facebook.Session.requestNewPermissions(Session.java:968)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at com.facebook.Session.requestNewPublishPermissions(Session.java:501)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at com.facebook.samples.sessionlogin.SampleFBPostActivity.performPublish(SampleFBPostActivity.java:113)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at com.facebook.samples.sessionlogin.SampleFBPostActivity.onClickPostStatusUpdate(SampleFBPostActivity.java:83)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at com.facebook.samples.sessionlogin.SampleFBPostActivity.onClick(SampleFBPostActivity.java:54)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at android.view.View.performClick(View.java:3511)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at android.view.View$PerformClick.run(View.java:14105)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at android.os.Handler.handleCallback(Handler.java:605)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at android.os.Handler.dispatchMessage(Handler.java:92)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at android.os.Looper.loop(Looper.java:137)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at android.app.ActivityThread.main(ActivityThread.java:4424)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at java.lang.reflect.Method.invokeNative(Native Method)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at java.lang.reflect.Method.invoke(Method.java:511)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
  02-09 14:00:36.126: E/AndroidRuntime(2396):   at dalvik.system.NativeStart.main(Native Method)

Please help me out by not using UiLifeCycleHelper class in your solution. Thanks in advance

Was it helpful?

Solution

Is there a particular reason you don't want to use the UiLifecycleHelper? That class is there specifically to make your life easier, and so you don't run into problems like this.

If you must, the easiest way is to look at the code inside UiLifecycleHelper, and copy them to the appropriate methods in your Activity.

For your specific Activity, I see two things wrong:

  1. You're not opening the Session at any time (you directly call requestNewPublishPermissions, but you need to open the session first). Calling "new Session" does not open it.

  2. You're not overriding the onActivityResult method, which is necessary to pass information back to the active session.

OTHER TIPS

try the following code. it is simplest sample to post the update:

put the code after the seeson login in:

session.addCallback(new StatusCallback() {

    @Override
    public void call(Session session, SessionState state,
        Exception exception) {
        List<String> PERMISSIONS = Arrays
            .asList("publish_actions");
        session
            .requestNewPublishPermissions(new Session.NewPermissionsRequest(
                getActivity(), PERMISSIONS));

        Request request = Request.newStatusUpdateRequest(
            session, "Temple Hello Word Sample",
            new Request.Callback() {
                @Override
                public void onCompleted(Response response) {
                    L.d("fb:done = "
                        + response.getGraphObject() + ","
                        + response.getError());
                }
            });
        request.executeAsync();

    }

});

The following is the whole code that from the sample session login of Facebook SDK3.0:

package com.facebook.samples.sessionlogin;

import java.util.Arrays;
import java.util.List;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import com.facebook.LoggingBehavior;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.Session.StatusCallback;
import com.facebook.SessionState;
import com.facebook.Settings;
import com.microtemple.android.lib.common.L;

public class SessionLoginFragment extends Fragment {
    private static final String         URL_PREFIX_FRIENDS  = "https://graph.facebook.com/me/friends?access_token=";

    private TextView                    textInstructionsOrLink;
    private Button                      buttonLoginLogout;
    private final Session.StatusCallback    statusCallback      = new SessionStatusCallback();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, container, false);

        buttonLoginLogout = (Button) view
            .findViewById(R.id.buttonLoginLogout);
        textInstructionsOrLink = (TextView) view
            .findViewById(R.id.instructionsOrLink);

        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

        Session session = Session.getActiveSession();
        if (session == null) {
            if (savedInstanceState != null) {
                session = Session.restoreSession(getActivity(), null,
                    statusCallback, savedInstanceState);
            }
            if (session == null) {
                session = new Session(getActivity());
            }
            Session.setActiveSession(session);
            if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
                session.openForRead(new Session.OpenRequest(this)
                    .setCallback(statusCallback));
            }
        }

        updateView();

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        Session.getActiveSession().addCallback(statusCallback);
    }

    @Override
    public void onStop() {
        super.onStop();
        Session.getActiveSession().removeCallback(statusCallback);
    }

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

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Session session = Session.getActiveSession();
        Session.saveSession(session, outState);
    }

    private void updateView() {
        Session session = Session.getActiveSession();
        if (session.isOpened()) {
            textInstructionsOrLink.setText(URL_PREFIX_FRIENDS
                + session.getAccessToken());
            buttonLoginLogout.setText(R.string.logout);
            buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onClickLogout();
                }
            });

            session.addCallback(new StatusCallback() {

                @Override
                public void call(Session session, SessionState state,
                    Exception exception) {
                    List<String> PERMISSIONS = Arrays
                        .asList("publish_actions");
                    session
                        .requestNewPublishPermissions(new Session.NewPermissionsRequest(
                            getActivity(), PERMISSIONS));

                    Request request = Request.newStatusUpdateRequest(
                        session, "getActiveSession",
                        new Request.Callback() {
                            @Override
                            public void onCompleted(Response response) {
                                L.d("fb:done = "
                                    + response.getGraphObject() + ","
                                    + response.getError());
                            }
                        });
                    request.executeAsync();

                }

            });


        } else {
            textInstructionsOrLink.setText(R.string.instructions);
            buttonLoginLogout.setText(R.string.login);
            buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onClickLogin();
                }
            });
        }
    }

    private void onClickLogin() {
        Session session = Session.getActiveSession();
        if (!session.isOpened() && !session.isClosed()) {
            session.openForRead(new Session.OpenRequest(this)
                .setCallback(statusCallback));
        } else {
            Session.openActiveSession(getActivity(), this, true,
                statusCallback);
        }
    }

    private void onClickLogout() {
        Session session = Session.getActiveSession();
        if (!session.isClosed()) {
            session.closeAndClearTokenInformation();
        }
    }

    private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state,
            Exception exception) {
            updateView();
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top