Facebook 3.0 Android第二次登录尝试返回“会话状态关闭”

62

我正在尝试将Facebook集成到我的Android应用中。使用Facebook登录按钮,我尝试登录。当我第一次安装应用程序时,它可以正常工作并成功登录。但是当我使用该按钮退出登录,然后再次尝试登录时,它会显示权限对话框,但SessionState返回的状态为关闭。有什么建议吗?

这是我的代码:

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();
 }
}

也许你在注销时应该重置你的isResumed。 - Danieboy
在你的代码中加入以下这行:super.onActivityResult(requestCode, resultCode, data);在你完成相关操作后,添加上述代码。此外,请按照官方文档中的步骤进行操作: https://developers.facebook.com/docs/facebook-login/android/我已经在我的应用程序中多次实现了Facebook登录,并且从未遇到任何问题。 - Wubbalubbadubdub
1个回答

1

对我来说状态没问题。根据需要,我会有打开和关闭状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接