4

私は Android 用の FB API 3.0 を使用しており、適切な方法でセッションを設定しようとしています。

しかし、私は何か間違ったことをしている、または何かが足りないと言っているようです。

ランチャー アクティビティで、セッションが既に存在するかどうかを確認し、存在しない場合は (FB の例のように) 新しいセッションを作成します。

Settings.addLoggingBehavior(LoggingBehaviors.INCLUDE_ACCESS_TOKENS);

    Session session = Session.getActiveSession();
    if (session != null){
    String sesija = session.toString();
    Log.w ("ss", sesija);}

    if (session == null) {
        if (savedInstanceState != null) {
            session = Session.restoreSession(this, null, MyGlobals.INSTANCE.statusCallback, savedInstanceState);
            Log.w("No Session found", "Loading saved session as it exists");
        }
        if (session == null) {
            session = new Session(this);
            Log.w("No Session found", "CreatingNewSession");

            String sesija2 = session.toString();
            Log.w ("ss2", sesija2);
        }
        Session.setActiveSession(session);
        if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
            session.openForRead(new Session.OpenRequest(this).setCallback(MyGlobals.INSTANCE.statusCallback));
            Log.w("There is an active session", "Active Session Exists");
        }

    }

この時点で、ログには次のように記載されています。

10-24 09:11:52.284: W/ss(1404): {Session state:CREATED, token:{AccessToken token: permissions:[}, appId:xxxxxx}

(AppId は正しい)

次に、フラグメントで、次のコードを使用して Facebook にログオンしようとします。

 Session session = Session.getActiveSession();
 if (!session.isOpened() && !session.isClosed()) {
            Log.w("Session is not opend", "Session is not closed");
            session.openForRead(new Session.OpenRequest(getActivity()).setCallback(MyGlobals.INSTANCE.statusCallback));
        } else {
            Session.openActiveSession(getActivity(), true, MyGlobals.INSTANCE.statusCallback);
            Log.w("Open Active Session", "Status Callback");
        }

この時点で、FB webview が表示されます。ユーザー名とパスを設定すると、うまくいき、消えます。

今、私はどこにもいません。応答が表示されず、TOKEN が受信されません。もう一度クリックして (同じボタンで) ログインすると、アプリがクラッシュします。

ログには、次のようなものがあります。

10-24 09:12:31.944: W/ss(1404): {Session state:OPENING, token:{AccessToken token: permissions:[}, appId:xxxxxx}

FB が提供する SessionLoginExample と比較すると、次のようになります。

10-24 09:08:50.004: W/ss(1356): {Session state:OPENED, token:{AccessToken token:AAAFaKtb7Pg4BALYg4B5eosa0ZAE9ZAXB0ZBMFDJdNbsDsZAkGJUfKtGs71OEJikDxT2VBfo4QMXiNASz23ZAa6D76eUxW0mZAMa013HP2kxgZDZD permissions:[}, appId:xxxxxxx}

つまり、返された AccessToken をキャッチせず、適切に保存されていないため、何か間違ったことをしています。

それは私が間違っていると思いますが、セッション情報を適切な方法で読み取る方法、またはフラグメント内のトークン情報をキャッチして保存する場所を言う方法がわかりません。

私はフラグメントに入れようとしました:

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

}

これは例の「onActivityResult」でしたが、何もしていないようです。

要約すると、ランチャー アクティビティの背後でセッションを作成します。次に、FB アプリがインストールされていない場合、Tab4 (設定) で、ユーザーは webview を使用して FB にログオンできるはずです。次に、Tab1 と Tab2 で、ユーザーは Instagram のように FB に画像を共有できるはずです。アプリがインストールされている場合は、タブ 4 を無効にし、ユーザーが Tab1 と Tab2 を使用して FB アプリを介して共有できるようにします。

Tnx。

解決済み:決して書かれていないが、よく知られているべきもの。FB 認証が実行される場合、「On Activity Result」コードを実行してトークンをセッションに保存する必要があります。ただし、私のようにフラグメントとタブを扱っている場合、関数「onActivityResult」はフラグメントコード内で実行されることはありませんが、フラグメント/タブを処理するアクティビティで実行する必要があります。

4

1 に答える 1

4

So it looks like you have already worked around this and your workaround is fine, but I wanted to give another option here in case it is cleaner for you or others to use the Fragment for this instead.

For cases where you cannot or do not want to derive from FacebookActivity, you can use either your Activity or your Fragment to initialize the Session. Both Activity and Fragment have onActivityResult you can override, and the one that gets used depends on what you pass to initialize Session.OpenRequest.

So if you want the callback to come to the Fragment, you can call:

...new Session.OpenRequest(myFragment)...

Then override onActivityResult in your Fragment and forward the call to your Session.

This is somewhat nicer in that your Fragment no longer needs to have special knowledge of what Activity it is running in.

于 2012-10-24T17:51:05.053 に答える