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
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.
try the following code. it is simplest sample to post the update:
put the code after the seeson login in:
The following is the whole code that from the sample session login of Facebook SDK3.0: