Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
197 views
in Technique[技术] by (71.8m points)

Facebook 3.0 Android second login attempt returns "Session state closed"

I am trying to integrate Facebook into my Android app. Using the Facebook Login Button, I tried to login in. When I first install the app, it works fine and login successfully. When I logged out using that button, and then try to login again, it shows the permission dialogue but SessionState return state is closed. Any Suggestions? Here is my Code

public class LoginActivity extends FragmentActivity {

 // private Login login;
 private boolean isResumed = false;
 private BirthDayComp app;
 private int Login = 0;
 private int LogOut = 1;
 private int Count = LogOut + 1;
 private boolean loged = false;
 private Fragment[] fragments = new Fragment[Count];
 private UiLifecycleHelper uiHelper;
 private Session.StatusCallback callback = new Session.StatusCallback() {
  @Override
  public void call(Session session, SessionState state, Exception exception) {
   onSessionStateChange(session, state, exception);
  }
 };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(R.layout.login_fragment);
  uiHelper = new UiLifecycleHelper(this, callback);
  uiHelper.onCreate(savedInstanceState);

  FragmentManager fm = getSupportFragmentManager();
  fragments[Login] = fm.findFragmentById(R.id.loginfb);
  fragments[LogOut] = fm.findFragmentById(R.id.logoutfb);
  FragmentTransaction transaction = fm.beginTransaction();
  transaction.commit();
  /*if (savedInstanceState == null) {
    login = new Login();
    getSupportFragmentManager()
    .beginTransaction()
    .add(android.R.id.content, login)
    .commit();
  } else {
    login = (Login) getSupportFragmentManager()
            .findFragmentById(android.R.id.content);
  }*/
 }


 @Override
 public void onResume() {
  super.onResume();
  uiHelper.onResume();
  isResumed = true;
 }

 @Override
 public void onPause() {
  super.onPause();
  uiHelper.onPause();
  /* Session session = Session.getActiveSession();
   session.removeCallback(callback);*/
  isResumed = false;
 }

 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  // uiHelper.onActivityResult(requestCode, resultCode, data);
  //  super.onActivityResult(requestCode, resultCode, data);
  Session session = Session.getActiveSession();
  int sanitizedRequestCode = requestCode % 0x10000;
  session.onActivityResult(this, sanitizedRequestCode, resultCode, data);
 }

 @Override
 public void onDestroy() {
  super.onDestroy();
  uiHelper.onDestroy();
 }

 @Override
 protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  uiHelper.onSaveInstanceState(outState);
 }

 @Override
 protected void onResumeFragments() {
  super.onResumeFragments();
  Session session = Session.getActiveSession();

  if (session != null && session.isOpened()) {
   // if the session is already open, try to show the selection fragment
   /*if(app.getFb()!=true){
    app.setFb(true);
   }*/

   showFragment(Login, false);
  } else {
   // otherwise present the splash screen and ask the user to login.
   //app.setFb(false);
   showFragment(Login, false);
  }
 }

 private void onSessionStateChange(Session session, SessionState state, Exception exception) {
  if (isResumed) {
   FragmentManager manager = getSupportFragmentManager();
   int backStackSize = manager.getBackStackEntryCount();
   for (int i = 0; i < backStackSize; i++) {
    manager.popBackStack();
   }
   // check for the OPENED state instead of session.isOpened() since for the
   // OPENED_TOKEN_UPDATED state, the selection fragment should already be showing.
   session = Session.getActiveSession();

   state = session.getState();
   if (state.equals(SessionState.OPENED)) {
    this.loged = true;
    showFragment(Login, false);

   } else if (state.isClosed()) {
    this.loged = false;
    System.gc();
    //session.closeAndClearTokenInformation();
    // showFragment(Login, false);
   }
  }
 }

 private void showFragment(int fragmentIndex, boolean addToBackStack) {

  FragmentManager fm = getSupportFragmentManager();
  FragmentTransaction transaction = fm.beginTransaction();
  for (int i = 0; i < fragments.length; i++) {
   if (i == fragmentIndex) {
    transaction.show(fragments[i]);
   } else {
    transaction.hide(fragments[i]);
   }
  }
  if (addToBackStack) {
   transaction.addToBackStack(null);
  }
  transaction.commit();
 }
}
question from:https://stackoverflow.com/questions/16961521/facebook-3-0-android-second-login-attempt-returns-session-state-closed

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

It's ok for me with states. I have open and close states as needed.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...