web-dev-qa-db-ja.com

Facebookログイン/ログアウトボタンを使用せずにFacebook SDK 3.0からプログラムでログアウトする方法

タイトルはそれをすべて言います。ユーザーのFacebook情報を取得するためにカスタムボタンを使用しています(「サインアップ」の目的で)。それでも、アプリに最後に登録されたユーザーや、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 );
              }
            });
    }
}

理想的には、このメソッドの最初に呼び出しを行って、以前のユーザーをログアウトします。

78

最新のSDKの更新:

@zeuterの答えは、Facebook SDK v4.7 +に対して正しいものになりました。

LoginManager.getInstance().logOut();

元の答え:

SessionTrackerを使用しないでください。これは内部(パッケージプライベート)クラスであり、パブリックAPIの一部として使用されることを意図していません。そのため、後方互換性を保証することなく、APIはいつでも変更される可能性があります。コード内のSessionTrackerのすべてのインスタンスを削除し、代わりにアクティブなセッションを使用する必要があります。

質問に答えるために、セッションデータを保持したくない場合は、アプリを閉じるときに closeAndClearTokenInformation を呼び出すだけです。

157
Ming Li

このメソッドは、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

    }

}
87
Rikin Prajapati

FacebookのAndroid SDK v4.0( changelog を参照)以降、次を実行する必要があります。

LoginManager.getInstance().logOut();
65
zeuter

Facebookからプログラムでログアウトできるスニペットを次に示します。私が改善する必要があるかもしれない何かを見たら教えてください。

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

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();
12
Aniket Thakur

SessionクラスはSDK 4.0で削除されました。ログイン管理は、クラスLoginManagerを介して行われます。そう:

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

参照 SDK 4.0へのアップグレード のように:

削除されたセッション-AccessToken、LoginManager、CallbackManagerクラスは、Sessionクラスの機能に優先して置き換えられます。

8
luizfelippe

うん、@ luizfelippeが言及したようにSessionクラスはSDK 4.0。以降に削除されましたLoginManagerを使用する必要があります。

LoginButtonログアウトのクラスを調べました。彼らはこの種のチェックを行っています。 accessTokenがnullでない場合にのみログアウトします。それで、私たちのコードにもこれを含める方が良いと思います。

AccessToken accessToken = AccessToken.getCurrentAccessToken();
if(accessToken != null){
    LoginManager.getInstance().logOut();
}
3
SureshCS50
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
selva_pollachi

Facebookには、アカウントからログインおよびログアウトする2つの方法があります。 1つはLoginButtonを使用することで、もう1つはLoginManagerを使用することです。 LoginButtonはボタンをクリックするだけで、ログインが完了します。一方、LoginManagerはこれを独自に実行します。あなたの場合、LoginManagerを使用して自動的にログアウトしました。

LoginManager.getInstance().logout()がこれを行います。

0
aravindkanna