2

Facebook ログインを使用して Android アプリを作成していますが、セッションを内部メモリに永続化することに固執しています。これが私がそれをインスタンス化する方法です:

private static Session openActiveSession(Activity activity, boolean allowLoginUI, StatusCallback callback, List<String> permissions) {
    OpenRequest openRequest = new OpenRequest(activity).setPermissions(permissions).setCallback(callback);
    Session session = getSession(activity);
    if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) {
        Session.setActiveSession(session);
        session.openForRead(openRequest);
        return session;
    }
    return null;
}

private static Session getSession(Activity activity) {
    return new Builder(activity).setTokenCachingStrategy(new SharedPreferencesTokenCachingStrategy(activity)).build();
}

問題は、 isOpened() が常に false を返すため、セッションを復元できるかどうかをチェックするこのコードが起動しないことです。

if((facebookSession = getSession(this)) != null && facebookSession.isOpened()) {
        waitDialog = ProgressDialog.show(this, getResources().getString(R.string.pleaseWait), getResources().getString(R.string.loadingData));
        onPostLogin();
        return;
    }

私はこれらの2つの機能でこれを回避しようとしました:

private void saveFacebookSession() {
Bundle facebookCache = new Bundle();
        Parcel parceledCache = Parcel.obtain();
        Session.saveSession(facebookSession, facebookCache);
        parceledCache.writeBundle(facebookCache);
        try {
            FileOutputStream output = openFileOutput(FACEBOOK_SESSION_FILE, MODE_PRIVATE);
            byte[] marshalledParcel = parceledCache.marshall();
            Editor prefsEditor = preferences.edit();
            prefsEditor.putInt(RESTORE_BYTE_COUNT, marshalledParcel.length);
            prefsEditor.commit();
            output.write(marshalledParcel);
            output.flush();
            output.close();
        } catch (Exception e) {
            Log.e(getClass().getName(), "Could not save the facebook session to storage");
        }
}



private boolean restoreFacebookSession() {
        try {
            FileInputStream input = openFileInput(FACEBOOK_SESSION_FILE);
            int arraySize = preferences.getInt(RESTORE_BYTE_COUNT, -1);
            if(arraySize == -1) {
                Log.e(getClass().getName(), "Could not read the facebook restore size");
                return false;
            }
            byte[] sessionData = new byte[arraySize];
            input.read(sessionData);
            Parcel readParcel = Parcel.obtain();
            readParcel.unmarshall(sessionData, 0, arraySize);
            Bundle sessionBundle = readParcel.readBundle();
            facebookSession = Session.restoreSession(getApplicationContext(), null, (StatusCallback)this, sessionBundle);
            return true;
        } catch (Exception e) {
            Log.e(getClass().getName(), "Could not restore the session");
            return false;
        }
    }

この 2 番目の方法は、バンドルの読み取り時にマジック ナンバーに関する例外がスローされるため、機能しません。

何か案は?

4

1 に答える 1

1

私は同じ問題に遭遇しました。問題は、最初にセッションを作成した後に Session.setActiveSession() を呼び出していないことです。そのため、 onActivityResult メソッドで行ったように、次のようなことをしていたと思います。

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        com.facebook.Session fbSession = com.facebook.Session.getActiveSession();
        if (fbSession != null) {
            fbSession.onActivityResult(this, requestCode, resultCode, data);
        }
    }

そのため、Facebook SDK getActiveSession からコールバックが読み取られることはなく、常に null が返されました。

于 2014-05-24T00:23:49.753 に答える