Reputation: 658
I am getting error
java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that has a pending request.
Following is my code,
public class MainActivity extends Activity {
private static final String TAG = "MainFragment";
private UiLifecycleHelper uiHelper;
WebView webView;
Button nextButton;
LoginButton authButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
authButton = (LoginButton) findViewById(R.id.authButton);
authButton.setReadPermissions(Arrays.asList("email","user_birthday","basic_info"));
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
}
private void onSessionStateChange(final Session session,
SessionState state, Exception exception) {
if (state.isOpened()) {
// ///////
Request request = Request.newMeRequest(session,
new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
String access_token = session.getAccessToken();
String email = user.asMap().get("email")
.toString();
Log.i("user",
"user fname====" + user.getFirstName());
Log.i("user",
"user lname======="
+ user.getLastName());
Log.i("user",
"user username====="
+ user.getUsername());
Log.i("user", "user email333======"
+ (String) response.getGraphObject()
.getProperty("email"));
Log.i("user", "user email new222======" + email);
Log.i("user", "user email new111======"
+ user.getProperty("email").toString());
Log.i("user",
"user DOB======" + user.getBirthday());
Log.i("user",
"user getName======" + user.getName());
Log.i("user", "access_token======"
+ access_token);
}
}
});
Request.executeBatchAsync(request);
// /////////
Log.i(TAG, "Logged in...");
authButton.setVisibility(View.VISIBLE);
}
else if (state.isClosed()) {
Log.i(TAG, "Logged out...");
}
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
System.out.println("statusCallBack Called");
onSessionStateChange(session, state, exception);
}
};
@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);
}
@Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
}
Upvotes: 4
Views: 7495
Reputation: 51
In order to give publish permissions before the user actually wants to publish something, from certain activity, and without using "UiLifecycleHelper". This method worked for me (based on many trial and the code in this specific tutorials: https://developers.facebook.com/docs/games/mobile/android-tutorial/ https://developers.facebook.com/docs/facebook-login/permissions/)
First create the request for permissions (in case the user doesn't have it):
Session session = Session.getActiveSession();
if (PostOnFB.isChecked() && session != null && session.isOpened()) {
List<String> permissions = session.getPermissions();
if (!permissions.contains("publish_actions")) {
// if they choose to publish, then we request for publish permissions
Session.NewPermissionsRequest newPermissionsRequest =
new Session.NewPermissionsRequest(GetUserLocationActivity.this, Arrays.asList("publish_actions"))
.setDefaultAudience(SessionDefaultAudience.FRIENDS)
.setCallback(newPermissionsCallback)
.setRequestCode(REAUTH_ACTIVITY_CODE);
session.requestNewPublishPermissions(newPermissionsRequest);
} else {
publishResult();
}
}
Where "publishResult()" is the method which will be called after the user gets the permissions.
Next, add a case for onActivityResult:
@Override
public void onActivityResult (
int requestCode, int resultCode, Intent data) {
// Decide what to do based on the original request code
switch (requestCode) {
case ..
..
..
..
..
case REAUTH_ACTIVITY_CODE :
Session.getActiveSession().onActivityResult(GetUserLocationActivity.this, requestCode, resultCode, data);
}
}
Finally implement the callback:
private Session.StatusCallback newPermissionsCallback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (exception != null || !session.isOpened() || !session.getPermissions().contains("publish_actions")) {
// this means the user did not grant us write permissions, so
// do whatever you think
} else {
publishResult();
}
}
};
That's it.
Upvotes: 2
Reputation: 1752
Use this Code inside your Activity.
authButton.setPublishPermissions("publish_actions", "email",
"user_birthday", "basic_info");
Upvotes: 2
Reputation: 8645
here is working code just try this Facebook login data
just create this method in this method
private void makeMeRequest(final Session session) {
Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {
public void onCompleted(GraphUser user, Response response) {
try{
Log.i("user", "user fname====" + user.getFirstName());
Log.i("user", "user lname=======" + user.getLastName());
Log.i("user", "user username=====" + user.getUsername());
createFacebookConnection(session);
} catch (Exception e) {
e.printStackTrace();
}
}
});
request.executeAsync();
}
facebook share data with facebook wall
public void createFacebookConnection(Session session) {
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
Session.StatusCallback statusCallback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
String message = "Facebook session status changed - "
+ session.getState() + " - Exception: " + exception;
Log.w("Facebook test", message);
if (session.isOpened() || session.getPermissions().contains("publish_actions")) {
publishToWall(session);
// share(session);
} else if (session.isOpened()) {
/* OpenRequest open = new OpenRequest(FacebookShareActivity.this).setCallback(this);
ArrayList<String> permission = new ArrayList<String>();
permission.add("publish_actions");
open.setPermissions(permission);
Log.w("Facebook test", "Open for publish");
session.openForPublish(open);*/
}
}
};
if (!session.isOpened() && !session.isClosed()&& session.getState() != SessionState.OPENING) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
} else {
Log.w("Facebook test", "Open active session");
Session.openActiveSession(this, true, statusCallback);
}
}
Upvotes: 0