私は 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」はフラグメントコード内で実行されることはありませんが、フラグメント/タブを処理するアクティビティで実行する必要があります。