Reputation: 10620
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
Upvotes: 4
Views: 9815
Reputation: 964
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();
}
}
}
Upvotes: 0
Reputation: 15662
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:
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.
You're not overriding the onActivityResult method, which is necessary to pass information back to the active session.
Upvotes: 7