2014-11-19 5 views
0

Facebook 계정을 생성하는 UiLifecycleHelper 클래스가 예전에 잘 작동했으나 갑자기 세션이 열리지 않고 Session.StatusCallback이 표시되지 않는 기본 Android 앱에 Facebook 로그인이 통합되었습니다. triggered 및 onSessionStateChange() 메서드가 호출되지 않습니다.UiLifecycleHelper가 Facebook 세션을 열지 않습니다.

public class SessionActivity extends FragmentActivity { 

private static final int SIGNUP = 0; 
private static final int CITYLIST = 1; 
private static final int FRAGMENT_COUNT = CITYLIST+1; 
private boolean isResumed = false; 


private Fragment[] fragments = new Fragment[FRAGMENT_COUNT]; 

private UiLifecycleHelper uiHelper; 
private Session.StatusCallback callback = 
    new Session.StatusCallback() { 
    @Override 
    public void call(Session session, 
      SessionState state, Exception exception) { 
     Toast.makeText(getApplicationContext(), "UiLifecycle is called", Toast.LENGTH_SHORT).show(); 

     onSessionStateChange(session, state, exception); 


    } 
}; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    uiHelper = new UiLifecycleHelper(this, callback); 
    uiHelper.onCreate(savedInstanceState); 
// Toast.makeText(getApplicationContext(), "UiLifecycle is not called",  Toast.LENGTH_SHORT).show(); 

    setContentView(R.layout.activity_session); 

    FragmentManager fm = getSupportFragmentManager(); 
    fragments[SIGNUP] = fm.findFragmentById(R.id.SignupFragment); 
    fragments[CITYLIST] = fm.findFragmentById(R.id.CityListFragment); 
    fragments[SETTINGS] = fm.findFragmentById(R.id.userSettingsFragment); 


    FragmentTransaction transaction = fm.beginTransaction(); 
    for(int i = 0; i < fragments.length; i++) { 
     transaction.hide(fragments[i]); 
    } 
    transaction.commit(); 

} 


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

@Override 
public void onPause() { 
    super.onPause(); 
    uiHelper.onPause(); 
    isResumed = false; 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data){ 
    super.onActivityResult(requestCode, resultCode, data); 
    uiHelper.onActivityResult(requestCode, resultCode, data); 
} 

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

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

private void showFragment(int fragmentIndex, boolean addToBackStack) { 
    Toast.makeText(getApplicationContext(), "showFragment is called", Toast.LENGTH_SHORT).show(); 

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


private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    // Only make changes if the activity is visible 
    Toast.makeText(getApplicationContext(), "onSessionStateChange is called", Toast.LENGTH_SHORT).show(); 

    if (isResumed) { 
     FragmentManager manager = getSupportFragmentManager(); 
     // Get the number of entries in the back stack 
     int backStackSize = manager.getBackStackEntryCount(); 
     // Clear the back stack 
     for (int i = 0; i < backStackSize; i++) { 
      manager.popBackStack(); 
     } 
     if (state.equals(SessionState.OPENED)) { 
      // If the session state is open: 
      // Show the authenticated fragment 
      showFragment(CITYLIST, false); 

     } else if (state.isClosed()) { 
      // If the session state is closed: 
      // Show the login fragment 
      showFragment(SIGNUP, false); 
     } 
    } 

    } 

@Override 
protected void onResumeFragments() { 
    super.onResumeFragments(); 
    Session session = Session.getActiveSession(); 
    Toast.makeText(getApplicationContext(), "onResumeFragments is called" + session.isOpened(), Toast.LENGTH_SHORT).show(); 

    if (session != null && session.isOpened()) { 
     // if the session is already open, 
     // try to show the selection fragment 
     showFragment(CITYLIST, false); 
    } else { 
     // otherwise present the splash screen 
     // and ask the person to login. 
     showFragment(SIGNUP, false); 
    } 
} 

}  

질문

왜 UILifeCycleHelper 도우미 새로운 FB 세션을 열고 의도 한 조각 (CityListFragment)를 개방하지?

는 정보 세션을 열 토큰 된 코드가 잘 전에 일하는

은 생성과 내가 만든 후 일부는 작동하지 편집합니다.

답변

0

내가 SessionActivity를 시작한 다른 활동에서 Facebook 로그인 버튼을 사용하려고했습니다. 내가 SessionActivity에서 fb 로그인 버튼을 사용하고 싶지 않은 이유는 다른 사용자가 로그인 버튼을 클릭하기를 원했기 때문입니다. SessionActivity의 onCreate() 메서드에서 Fb loginbutton을 숨김으로써 Fb loginbutton을 사용하여 이것을 해결하고 performclick() 메서드를 사용하여 클릭 연결을 수행했습니다 (사용자가 이미 다른 활동의 사용자 정의 단추를 눌렀 기 때문에 나는 사용했다.) 이제 새로운 세션이 열렸다.

LoginButton loginBtn; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    uiHelper = new UiLifecycleHelper(this, callback); 
    uiHelper.onCreate(savedInstanceState); 

    loginBtn = (LoginButton) findViewById(R.id.fb_profile_activity_button); 
    loginBtn.setVisibility(View.INVISIBLE); 
    loginBtn.performClick(); 


    FragmentManager fm = getSupportFragmentManager(); 
    fragments[SIGNUP] = fm.findFragmentById(R.id.signup_fragment); 
    fragments[CITYLIST] = fm.findFragmentById(R.id.citylist_fragment); 

    FragmentTransaction transaction = fm.beginTransaction(); 
    for(int i = 0; i < fragments.length; i++) { 
     transaction.hide(fragments[i]); 
    } 
    transaction.commit(); 
} 
관련 문제