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


80

제목에 모든 것이 나와 있습니다. 사용자의 페이스 북 정보를 가져 오기 위해 사용자 정의 버튼을 사용하고 있습니다 ( "가입"목적). 그러나 앱이 마지막으로 등록 된 사용자를 기억하고 싶지 않으며 현재 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 );
              }
            });
    }
}

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

답변:


161

최신 SDK 업데이트 :

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

LoginManager.getInstance().logOut();

원래 답변 :

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

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


3
Session.getActiveSession을 호출하고 null을 반환하면 1.) Session.Builder를 사용하여 새 세션을 만들고 Session.setActiveSession을 호출하거나 2.) Session.openActiveSession 메서드 중 하나를 호출 할 수 있습니다 (정적 둘 다 열리고 활성 세션을 설정합니다).
Ming Li

24
그리고 로그 아웃하기 위해 세션을 열어야한다는 사실은 Facebook SDK 디자인이 얼마나 나쁜지를 보여줍니다. 표준 콜백이 포함 된 간단한 공용 API를 제공하는 대신 엉뚱한 메커니즘을 구현해야합니다… 놀랍습니다.
Martin Marconcini 2013

18
Facebook SDK 및 문서는 한심합니다!
Skynet 2015 년

3
공식 Facebook 문서에는 더 이상 사용되지 않는 예제에 코드가 포함되어 있습니다. 그런 다음 동일한 기능을 사용하지 않으려면 좋은 오래된 스택을 참조해야합니다.
Skynet

1
대화에 기여하지 않는 댓글을 추가하는 대신 문서가 부족한 특정 예 (질문 / 답변 관련)를 제공하거나 개발자 포털의 특정 문서 페이지 하단으로 이동하여 클릭 할 수 있습니다. "이 문서가 도움이 되었습니까?"에 대한 "아니오"버튼을 클릭합니다.
Ming Li

87

이 방법은 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

    }

}

3
활동 대신 조각을 사용하는 경우 유일한 작업 솔루션이었습니다!
Roger Alien

왜 코드에 다른 부분이 있습니까? 사용자가 로그인하지 않은 경우 다시 로그인 한 다음 로그 아웃해야하는 이유는 무엇입니까?
Vihaan Verma 2014

1
java.lang.NullPointerException 오류 발생 : 'applicationId'인수는 null 일 수 없습니다.
Krunal Shah

세션을 초기화하는 적절한 방법은 new Session.Builder (context) .build ();
hasan

66

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

LoginManager.getInstance().logOut();

7
감사합니다. 그러나 이것이 실제로 세션을 지우는 것 같지는 않습니다. LoginManager.logout ()은 내부적으로 "AccessToken.setCurrentAccessToken (null); Profile.setCurrentProfile (null);"을 호출합니다. 사용자가 다음에 앱을 시작할 때 자격 증명을 다시 입력하지 않고도 로그인 할 수 있음을 확인했습니다. 사용자가 자격 증명을 다시 입력하도록 강제하는 방법은 무엇입니까?
swooby

이 방법이 도움이되었습니다. 이를 호출하고 다시 로그인을 시도한 후 예상대로 자격 증명 입력 화면이 나타납니다. 정말 감사합니다.
Zsolt Boldizsár

1
@swooby가 지적했듯이이 솔루션은 안타깝게도 facebook sdk v4.x를 사용하는 앱에서 작동하지 않습니다. 로그 아웃 후 AccessToken은 [{AccessToken token : ACCESS_TOKEN_REMOVED permissions : [public_profile]}]이지만 AccessToken.getCurrentAccessToken (). getToken ()은 유효한 토큰을 반환합니다. 사용자가 더 이상 로그인하지 않거나 앱에 대한 권한을 취소 한 경우에도 문자열입니다.
Lisitso

@ Lisitso 지금 그 해결책을 알고 있습니까?
Jaec

1
@Jaec 저는 "Aniket Thakur"가 제공 한 솔루션을 사용했습니다. 다른 안식처 중에서 여기에서 찾을 수 있습니다. 건배!
Lisitso

27

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

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

jpotter6 mApp은 무엇입니까?
Amitsharma 2014 년

모든 Android 애플리케이션에서 사용할 수있는 Application 클래스의 인스턴스
Eenvincible 2011

13

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

2
이 질문에 대한 정답입니다. 호출은 프로그래밍 방식으로 사용자의 Facebook 계정에서 앱 액세스를 취소하는 LoginManager.getInstance().logOut();동안 로컬 캐시 만 지 웁니다 GraphRequest. 둘 다 필요합니다. 둘 다 혼자서 충분하지 않습니다.
YS

삭제 권한을 위해이 코드를 어디에 넣어야합니까?! 제 경우에는 코드가 작동하지 않습니다! 전체 코드 스 니펫을 제공해 주시겠습니까?!?
Akshay Shinde

코드가 작동하지만 경고 : 액세스 토큰없이 요청에 애플리케이션 ID 또는 클라이언트 토큰이 없습니다. 위 코드에서 "/ {user-id} / permissions /"에 무언가를 추가해야합니까?
zeeshan

나와 함께 {사용자 ID} 대체 @zeeshan
싱 Amritpal

8

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

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

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

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


1
zeuter 의 대답 은 더 짧고 동일한 API 호출을 지적합니다. 왜 중복입니까?
rekire aug

3

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

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

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

zeuter 의 대답 은 더 짧고 동일한 API 호출을 지적합니다. 왜 중복입니까?
rekire aug

0
private Session.StatusCallback statusCallback = new SessionStatusCallback();

logout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Session.openActiveSession(this, true, statusCallback);  
}
});

private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state,
Exception exception) {
session.closeAndClearTokenInformation();    
}
}

0

Facebook은 계정에서 로그인 및 로그 아웃하는 두 가지 방법을 제공합니다. 하나는 LoginButton을 사용하는 것이고 다른 하나는 LoginManager를 사용하는 것입니다. LoginButton은 클릭하면 로그인이 완료되는 버튼입니다. 반면에 LoginManager는이 작업을 자체적으로 수행합니다. 귀하의 경우에는 LoginManager를 사용하여 자동으로 로그 아웃했습니다.

LoginManager.getInstance().logout() 이것이 당신을 위해 작동합니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.