Java.lang.UnsupportedOperationException: session: An attempt was made to request new permissions for a session with a pending request

Below is the code for posting status update using facebookSDK3.0 in android. If I use the UiLifeCycleHelper class, it works well. But I want to post status to facebook without using the UiLifeCycleHelper class. I tried the code below that causes an error in my logarithm, and my application is forcibly 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; } } } 

The following is the error in 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 by not using the UiLifeCycleHelper class in your solution. thanks in advance

+4
source share
2 answers

Is there a specific reason why you do not want to use the UiLifecycleHelper? This class is specifically designed to make your life easier, and therefore you do not encounter such problems.

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

For your specific activity, I see two errors:

  • You do not open the session at any time (you directly call the NewPublishPermissions request, but you must open the session first). Calling a "new session" does not open it.

  • You do not override the onActivityResult method, which is necessary to transfer information to the active session.

+7
source

try the following code. This is a simple example to post an update:

enter the code after logging in to log 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) { Ld("fb:done = " + response.getGraphObject() + "," + response.getError()); } }); request.executeAsync(); } }); 

Below is all the code that is from the input session name of the Facebook SDK3.0 session:

 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) { Ld("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(); } } } 
0
source

All Articles