[android] Facebook 로그인 / 로그 아웃 버튼을 사용하지 않고 Facebook SDK 3.0에서 프로그래밍 방식으로 로그 아웃하는 방법은 무엇입니까?

제목에 모든 것이 나와 있습니다. 사용자의 페이스 북 정보를 가져 오기 위해 사용자 정의 버튼을 사용하고 있습니다 ( “가입”목적). 그러나 앱이 마지막으로 등록 된 사용자를 기억하고 싶지 않으며 현재 Facebook 기본 앱을 통해 로그인 한 사람도 기억하지 않습니다. Facebook 로그인 활동이 매번 팝업되기를 원합니다. 그래서 프로그래밍 방식으로 이전 사용자를 로그 아웃하고 싶습니다.

어떻게 할 수 있습니까? 로그인 방법은 다음과 같습니다.

private void signInWithFacebook() {

    SessionTracker sessionTracker = new SessionTracker(getBaseContext(), new StatusCallback()
    {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
        }
    }, null, false);

    String applicationId = Utility.getMetadataApplicationId(getBaseContext());
    mCurrentSession = sessionTracker.getSession();

    if (mCurrentSession == null || mCurrentSession.getState().isClosed()) {
        sessionTracker.setSession(null);
        Session session = new Session.Builder(getBaseContext()).setApplicationId(applicationId).build();
        Session.setActiveSession(session);
        mCurrentSession = session;
    }

    if (!mCurrentSession.isOpened()) {
        Session.OpenRequest openRequest = null;
        openRequest = new Session.OpenRequest(RegisterActivity.this);

        if (openRequest != null) {
            openRequest.setPermissions(null);
            openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);

            mCurrentSession.openForRead(openRequest);
        }
    }else {
        Request.executeMeRequestAsync(mCurrentSession, new Request.GraphUserCallback() {
              @Override
              public void onCompleted(GraphUser user, Response response) {
                  fillProfileWithFacebook( user );
              }
            });
    }
}

이상적으로는이 메서드를 시작할 때 이전 사용자를 로그 아웃하도록 호출합니다.



답변

최신 SDK 업데이트 :

이제 @zeuter의 대답은 Facebook SDK v4.7 +에 맞습니다.

LoginManager.getInstance().logOut();

원래 답변 :

SessionTracker를 사용하지 마십시오. 내부 (패키지 개인) 클래스이며 공용 API의 일부로 사용되지 않습니다. 따라서 API는 이전 버전과의 호환성 보장없이 언제든지 변경 될 수 있습니다. 코드에서 SessionTracker의 모든 인스턴스를 제거하고 대신 활성 세션을 사용할 수 있어야합니다.

질문에 답하려면 세션 데이터를 유지하지 않으려면 앱이 닫힐 때 closeAndClearTokenInformation을 호출 하면됩니다.


답변

이 방법은 Android에서 프로그래밍 방식으로 Facebook에서 로그 아웃하는 데 도움이됩니다.

/**
 * Logout From Facebook 
 */
public static void callFacebookLogout(Context context) {
    Session session = Session.getActiveSession();
    if (session != null) {

        if (!session.isClosed()) {
            session.closeAndClearTokenInformation();
            //clear your preferences if saved
        }
    } else {

        session = new Session(context);
        Session.setActiveSession(session);

        session.closeAndClearTokenInformation();
            //clear your preferences if saved

    }

}


답변

Facebook의 Android SDK v4.0 ( changelog 참조 )부터 다음을 실행해야합니다.

LoginManager.getInstance().logOut();


답변

다음은 내가 페이스 북에서 프로그래밍 방식으로 로그 아웃 할 수있게 해주는 스 니펫입니다. 개선해야 할 사항이 있으면 알려주세요.

private void logout(){
    // clear any user information
    mApp.clearUserPrefs();
    // find the active session which can only be facebook in my app
    Session session = Session.getActiveSession();
    // run the closeAndClearTokenInformation which does the following
    // DOCS : Closes the local in-memory Session object and clears any persistent 
    // cache related to the Session.
    session.closeAndClearTokenInformation();
    // return the user to the login screen
    startActivity(new Intent(getApplicationContext(), LoginActivity.class));
    // make sure the user can not access the page after he/she is logged out
    // clear the activity stack
    finish();
}


답변

Facebook의 Android SDK v4.0부터 다음을 실행해야합니다.

LoginManager.getInstance().logOut();

이것만으로는 충분하지 않습니다. 이것은 단순히 토큰 캐시 액세스를 지우고 그래서 프로파일됩니다 AccessToken.getCurrentAccessToken()Profile.getCurrentProfile()이제 널 (null)이 될 것입니다.

완전히 로그 아웃하려면 권한을 취소 한 다음을 호출해야합니다 LoginManager.getInstance().logOut();. 권한을 취소하려면 다음 그래프 API를 실행하십시오.

    GraphRequest delPermRequest = new GraphRequest(AccessToken.getCurrentAccessToken(), "/{user-id}/permissions/", null, HttpMethod.DELETE, new GraphRequest.Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {
            if(graphResponse!=null){
                FacebookRequestError error =graphResponse.getError();
                if(error!=null){
                    Log.e(TAG, error.toString());
                }else {
                    finish();
                }
            }
        }
    });
    Log.d(TAG,"Executing revoke permissions with graph path" + delPermRequest.getGraphPath());
    delPermRequest.executeAsync();


답변

SDK 4.0에서 세션 클래스가 제거되었습니다. 로그인 관리는 LoginManager 클래스를 통해 수행됩니다 . 그래서:

mLoginManager = LoginManager.getInstance();
mLoginManager.logOut();

SDK 4.0으로 업그레이드 하는 참조에 따르면 다음과 같습니다.

세션 제거됨 -AccessToken, LoginManager 및 CallbackManager 클래스가 세션 클래스의 기능을 대체하고 대체합니다.


답변

@luizfelippe가 언급했듯이 세션 클래스는 SDK 4.0 이후로 제거되었습니다 . LoginManager를 사용해야합니다.

로그 아웃을 위해 LoginButton 클래스를 살펴 보았습니다 . 그들은 이런 종류의 점검을하고 있습니다. accessToken 이 null이 아닌 경우에만 로그 아웃됩니다 . 그래서 우리 코드에도 이것을 포함하는 것이 낫다고 생각합니다 ..

AccessToken accessToken = AccessToken.getCurrentAccessToken();
if(accessToken != null){
    LoginManager.getInstance().logOut();
}