0

Facebook SDK 3.0.1 で次のシナリオがあります。ユーザーが最初にログインして「FB ログイン」を選択すると、SSO が開始され、新しいセッションが開かれ、すべてが正常に機能します。しかし、その後、ユーザーがアプリを閉じて再度起動すると、最後に開いているセッションを取得する方法がわかりません。現在、新しいセッションを開いているときに、ユーザーに FB 進行状況バーが再び表示されます (接続されている間)。再度 FB を実行しますが、ユーザーは前回の実行で既に FB を承認しています)。この操作をスキップする方法を知っている人はいますか?

編集1:

これは私がセッションを取得する方法です:

public void tryRetrievFacebookSession() {
    Session session = Session.getActiveSession();

    if (session != null && session.isOpened())
        return;

    session = Session.openActiveSession(this, true, new Session.StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            MobliLog.d("SplashScreen", "Inside call() with session with state: " + session.getState());
            // onSessionStateChanged(session, state, exception);
        }
    });

}

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Session session = Session.getActiveSession();

    if (session != null)
        session.onActivityResult(this, requestCode, resultCode, data);

    uiHelper.onActivityResult(requestCode, resultCode, data);

}

セッションは通常、LoginButton から、または次の行で作成されます。

session = Session.getActiveSession();

    if (session.getState().isClosed())
        session = new Session(this);

    if (session.isOpened()) {
        onAuthenticationEndListener.onSuccessfullAuthentication();
        return;
    } else {
        this.onFacebookAuthenticationEndListener = onAuthenticationEndListener;
        Session.setActiveSession(session);
        session.openForRead(new Session.OpenRequest(SocNetwksCompatScreen.this).setCallback(null));
        return;
    }

情報 1:

最初のセッションセッションを行っているとき = Session.getActiveSession(); sso 認証後のログインで、セッションの状態が OPENED ではなく CLOSED になっている

情報 2: uiHelper を使用しており、次のように初期化します。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    twitter = SocialPluginsUtils.getTwitterClient();

    uiHelper = new UiLifecycleHelper(this, statusCallback); 
    uiHelper.onCreate(savedInstanceState);
}

今、私は Session.getActiveSession(); を実行した後にそれを知っています。セッション状態は OPENED になり、その後 OPEN になり、uiHelper のコールバックが呼び出されます。私のコードでは、状態は CLOSED または CLOSED_LOGIN_FAILED または CREATED (安定していない理由がわからない) であり、残りは発生しません

4

3 に答える 3

2

実際、ユーザーがアプリを閉じるたびにセッションが閉じられます。
したがってSession.getActiveSession()、null セッションを返す場合は、 を呼び出すだけで済みますSession.openActiveSession(activity, true, sessionCallback)

有効なトークン キャッシュがある場合、このメソッドはそれを使用して、ユーザーがデータを挿入する必要なく新しいセッションを開きます。それ以外の場合は、基本的な権限を持つ既定のダイアログが表示されます。

于 2013-04-24T11:23:36.740 に答える
0

編集後にわかることから、問題はセッションの管理方法に関連している可能性があります。私は自分のプロジェクトでこのコードを使用しています:

    Session session = Session.getActiveSession();

    if (session == null){
        Session.openActiveSession(activity, true, sessionCallback);
    }

    else if (!session.getState().isOpened()){
        session.openForRead(new Session.OpenRequest(activity)
                .setCallback(sessionCallback));
                    //this will open the session with basic read permissions
    }

    else {          
        //do what you want with the opened session
    } 

さらにUiLifecycleHelper、コメントで提案した 2 行のコードを使用する必要がない場合、それらは既にヘルパーのメソッドに含まれています。ただし、アクティビティの関連する各メソッド (onResume、onPause など) でヘルパーのすべてのメソッドを必ず呼び出す必要があります。

トークン キャッシュがない場合はopenActiveSession(activity, true, sessionCallback)、新しいダイアログが自動的に呼び出され、ユーザーがログインに成功すると、新しいトークン キャッシュが将来の使用に使用できるようになります。

于 2013-04-24T17:49:28.747 に答える
0

問題が解決しました。誤って session.closeAndClearTokenInformation(); を呼び出しました。onStop() で(ええ、とてもばかげています!)

于 2013-04-25T10:13:02.630 に答える