2

「はじめに」ドキュメントで説明されているように、Facebook ログインを使用しています -https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/

 // start Facebook Login
Session.openActiveSession(this, true, new Session.StatusCallback() {

  // callback when session changes state
  @Override
  public void call(Session session, SessionState state, Exception exception) {
    if (session.isOpened()) {

      // make request to the /me API
      Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

        // callback after Graph API response with user object
        @Override
        public void onCompleted(GraphUser user, Response response) {
          if (user != null) {
            TextView welcome = (TextView) findViewById(R.id.welcome);
            welcome.setText("Hello " + user.getName() + "!");
          }
        }
      });
    }
  }
});

このコードを使用すると、Facebook は (Facebook アプリにログインした) ユーザーを認識し、これがログインしたいユーザーであると想定します。

どの Facebook アカウントを使用するかの決定をユーザーに任せたいとしましょう。 どうやってやるの?

私がこれまでに試したこと:

1) 次のようにユーザー ログインを実行します。

 SessionTracker sessionTracker = new SessionTracker(activity, new StatusCallback() {

            @Override
            public void call(Session session, SessionState state, Exception exception) {
            }
        }, null, false);

        if (sessionTracker.getSession() == null || sessionTracker.getSession().getState().isClosed()) {
            sessionTracker.setSession(null);
            Session session = new Session.Builder(activity).setApplicationId(activity.getString(R.string.fb_app_id)).build();
            Session.setActiveSession(session);
        }

        final Session currentSession = sessionTracker.getSession();

        if (!currentSession.isOpened()) {

            Session.OpenRequest openRequest = null;
            openRequest = new Session.OpenRequest(activity);

            if (openRequest != null) {
                openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS);
                openRequest.setPermissions(Arrays.asList("email", "publish_actions"));
                openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
                openRequest.setCallback(new StatusCallback() {

                    @Override
                    public void call(Session session, SessionState state, Exception exception) {

                        Request.executeMeRequestAsync(currentSession, new Request.GraphUserCallback() {

                            @Override
                            public void onCompleted(GraphUser user, Response response) {
                                authListener.onCompleteAuthorization(user != null, user, currentSession.getAccessToken(), currentSession.getExpirationDate().getTime());
                            }
                        });

                    }
                });
                currentSession.openForPublish(openRequest);

これは初めて正常に機能しますが、2回目に呼び出されました(ユーザーがアプリからログアウトした後、別のFacebookアカウントで再ログインしたいとしましょう)、最後にログインしたユーザーを覚えています. !!アンインストール後でもFacebookアプリと私のアプリ!!!!

2) 再度ログインする前に同じコードを呼び出す:

 if (Session.getActiveSession() != null) {
            Session.getActiveSession().closeAndClearTokenInformation();
        }

それは何もしません...

以前のFacebookユーザー履歴/キャッシュされたトークンをすべてクリアして、次の動作を実現する方法を理解するのを手伝ってください:ユーザーがFacebookログインを実行するたびに、Facebookの「メールとパスワードを入力してください」ダイアログが表示されます...

前もって感謝します..

4

1 に答える 1

3

まず、SessionTracker を直接使用しないでください。これはパブリック クラスではなく、直接使用するためのものではありません。

第二に、毎回電子メール/パスワード ダイアログをポップアップ表示する場合は、SSO ログインを無効にする必要があります。複数のセッションでそれを行う方法については、SwitchUserSample の内部を見ることができますが、その要点は次のとおりです。

Session s = new Session(this);
Session.setActiveSession(s);
Session.OpenRequest request = new Session.OpenRequest(this);
request.setPermissions(...); // Note that you cannot set email AND publish_actions in the same request
request.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
request.setCallback(...);
s.openForRead(request);

しばらくして、コールバックで、セッションが開いているかどうか、publish_actions 権限が含まれているかどうか、含まれていない場合は追加の発行権限を要求するかどうかを確認する必要があります (例については、Scrumptious サンプルを参照してください)。

最後に、ユーザーがログアウトしたら、前に行ったように closeAndClearTokenInformation() メソッドを呼び出します。ダイアログログインを強制しているので、期待どおりに機能します。

于 2013-05-02T16:42:00.073 に答える