Facebookのログイン/ログアウトボタンを使用せずにFacebookSDK 3.0からプログラムでログアウトするにはどうすればよいですか?


80

タイトルがすべてを物語っています。カスタムボタンを使用して、ユーザーの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 );
              }
            });
    }
}

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

回答:


161

最新のSDKの更新:

これで、@ zeuterの答えはFacebookSDK v4.7 +に対して正しいです。

LoginManager.getInstance().logOut();

元の答え:

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

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


3
Session.getActiveSessionを呼び出すだけで、nullが返された場合は、1。)Session.Builderを使用して新しいセッションを作成し、Session.setActiveSessionを呼び出すか、2。)Session.openActiveSessionメソッドの1つ(静的1つは、アクティブなセッションを開いて設定します)。
Ming Li

24
そして、ログアウトするためにセッションを開かなければならないという事実は、Facebook SDKの設計がいかに悪いかを示しています…標準のコールバックを備えた単純なパブリックAPIを提供する代わりに、くだらないメカニズムを実装する必要があります…驚くべきことです。
Martin Marconcini 2013年

18
Facebook SDKとドキュメントは哀れです!
スカイネット2015年

3
Facebookの公式ドキュメントには、非推奨のコードが例に含まれています。非推奨にしないには、古き良きスタックを参照する必要があります。
スカイネット2015年

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
アクティビティの代わりにフラグメントを使用する場合、私にとって唯一の有効な解決策でした!
ロジャーエイリアン

なぜコードにelse部分があるのですか?ユーザーがログインしていない場合、なぜユーザーに再度ログインしてからログアウトする必要があるのでしょうか。
Vihaan Verma 2014

1
エラーが発生するjava.lang.NullPointerException:引数 'applicationId'をnullにすることはできません
Krunal Shah 2015

セッションを初期化する適切な方法は、new Session.Builder(context).build();だと思います。
hasan 2015

なぜそのelse部分?
aandis 2015

66

FacebookのAndroidSDK v4.0(変更ログを参照)以降、以下を実行する必要があります。

LoginManager.getInstance().logOut();

7
ありがとう、しかし私はこれが実際にセッションをクリアするのを見ていません。LoginManager.logout()は、内部で「AccessToken.setCurrentAccessToken(null); Profile.setCurrentProfile(null);」を呼び出すだけです。ユーザーが次にアプリを起動したときに資格情報を再入力しなくてもログインできることがわかりました。ユーザーに資格情報の再入力をどのように強制しますか?
swooby 2015年

この方法は私を助けました。呼び出して再ログインを試みた後、期待どおりに資格情報の入力画面が表示されました。トンありがとう。
ゾルトBoldizsár

1
@swoobyが指摘したように、残念ながら、このソリューションはfacebook sdk v4.xを使用するアプリでは機能しません。ログアウト後、AccessTokenは[{AccessToken token:ACCESS_TOKEN_REMOVEDpermissions:[public_profile]}]ですが、AccessToken.getCurrentAccessToken()。getToken()は有効なトークンを返しますユーザーがログに記録されていないか、アプリへの認証が取り消されていない場合でも、文字列。
Lisitso 2015年

@Lisitsoあなたは今その解決策を知っていますか?
Jaec 2016

1
@Jaec「AniketThakur」が提供するソリューションを使用しました。あなたは他の休息の中でここを見つけることができます。乾杯!
Lisitso 2016

27

これは、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();
}

jpotter6 mAppとは何ですか?
アミットシャルマ2014

すべてのAndroidアプリケーションで利用可能なApplicationクラスのインスタンス
Eenvincible 2015年

13

FacebookのAndroidSDK 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
これがこの質問に対する正解です。LoginManager.getInstance().logOut();ローカルキャッシュをクリアするだけですが、GraphRequest呼び出しはプログラムでユーザーのFacebookアカウントからのアプリアクセスを取り消します。両方が必要です。どちらも単独では十分ではありません。
イース

削除権限のためにこのコードをどこに置く必要がありますか?!私の場合、コードが機能していません!完全なコードスニペットサーを提供できますか?!?
Akshay Shinde 2016

コードは機能していますが、警告が表示されます。アクセストークンなしでリクエストすると、アプリケーションIDまたはクライアントトークンが見つかりません。上記のコードの「/ {user-id} / permissions /」に何かを追加する必要がありますか?
zeeshan 2016年

@zeeshanは{user-id}を私に置き換えます
Amritpal singh 2018

8

セッションクラスはSDK4.0で削除されました。ログインの管理は、LoginManagerクラスを介して行われます。そう:

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

参照としてSDK4.0へのアップグレードは言う:

セッションが削除されました-AccessToken、LoginManager、およびCallbackManagerクラスは、Sessionクラスの機能に取って代わります。


1
zeuterの答えは短く、同じapi呼び出しを示しています。なぜ重複するのですか?
rekire 2015

3

はい、@ luizfelippeが述べたように、セッションクラスはSDK4.0以降削除されましたLoginManagerを使用する必要があります。

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

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

zeuterの答えは短く、同じapi呼び出しを示しています。なぜ重複するのですか?
rekire 2015

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

LoginManager.getInstance().logout() これはあなたのために働きますか。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.