2

我正在为我的 Android 应用程序开发 Facebookintegration 并减少麻烦,我正在尝试创建一个单例类来将 facebook 逻辑与我的应用程序的主要逻辑分开。

我希望能够从我的应用程序的不同部分(入口点、异步任务......)调用这个类。此时,我首先以applicationcontext为上下文调用initialize函数。在这个初始化之后,我希望能够调用例如。FacebookSession.getInstance().login()FacebookSession.getInstance().requestWithQuery(examplestring)

问题是我找不到像样的文档。甚至 facebook 官方示例也使用旧的 Facebook 对象,该对象已被弃用。我把这个类和我能找到的不同部分的代码放在一起,我想出了这个:

package be.ugent.zeus.hydra.util.facebook;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import com.facebook.HttpMethod;
import com.facebook.Request;
import com.facebook.Session;
import com.facebook.SessionState;

public class FacebookSession {

    private static final String APP_ID = "hidden";
    private static final String ACCESS_TOKEN = "hidden";
    private static FacebookSession fbSession;
    public static final String TAG = "FACEBOOK";
    private Activity activity;
    private static Session.StatusCallback statusCallback = new SessionStatusCallback();

    protected FacebookSession() {
    }

    public static void initialize(Context context) {

        Session session = Session.getActiveSession();
        if (session == null) {
            session = new Session.Builder(context)
                .setApplicationId(APP_ID)
                .build();
        }
        Session.setActiveSession(session);
    }

    public static FacebookSession getInstance() {

        if (fbSession == null) {
            fbSession = new FacebookSession();
        }

        return fbSession;
    }

    public Session getSession() {
        return Session.getActiveSession();
    }

    public void tryOpenSession(Activity activity) {
        Session session = Session.openActiveSession(activity, false, statusCallback);
        Session.setActiveSession(session);
    }

    public void login(Activity activity) {
        Session session = Session.getActiveSession();

        if (!session.isOpened() && !session.isClosed()) {
            Session.openActiveSession(activity, true, statusCallback);
        }
    }

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

        if (!session.isClosed()) {
            session.closeAndClearTokenInformation();
        }
    }

    public boolean isOpen() {

        Session session = Session.getActiveSession();
        return session.isOpened();
    }

    public Request requestWithQuery(String query) {

        Bundle bundle = new Bundle();
        bundle.putString("q", query);

        return requestWithGraphPath("/fql", bundle, "GET");
    }

    private Request requestWithGraphPath(String path, Bundle bundle, String method) {

        // Get the session
        Session session = Session.getActiveSession();

        // No session? Try to open one without user interaction
        if (session == null) {
            session = Session.openActiveSession(activity, false, statusCallback);
            Session.setActiveSession(session);
        }

        // Still no session? Use the default key
        if (session == null) {
            bundle.putString("access_token", ACCESS_TOKEN);
        }

        return new Request(session, path, bundle, HttpMethod.valueOf(method));

    }

    private static class SessionStatusCallback implements Session.StatusCallback {

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

            Log.i(TAG, state.toString());

            switch (state) {
                case CLOSED:
                case CLOSED_LOGIN_FAILED:
                    session.closeAndClearTokenInformation();
                    break;
                default:
                    break;
            }
        }
    }
}

查询部分工作得非常整洁,但会话却没有。例如,如果我调用 login 函数,则活动会话为空,但是我确实使用应用程序入口点中的 applicationcontext 初始化了 Session。

具体来说,我有这个问题:

  • 这是(尝试)跟踪会话状态的“好”方式吗?可以这样做吗?如果是这样,我做错了什么,它只是不起作用?

作为后续问题:

  • 如果不是,那么在应用程序生命周期和应用程序会话之间跟踪会话的正确方法是什么?

提前致谢。

4

1 回答 1

4

我不是 100% 确定我理解这个问题,但是 FWIW,以下对我有用:

在某处的活动中:

Session.openActiveSession(MyActivity.this, true, new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        if(session.isOpened()) {
            Log.d(TAG, "FB session opened successfully");
        } else {
            Log.d(TAG, "FB session not opened ... " + exception.toString());
        }
    }
});

然后,在其他地方(不同的 Activity、AsyncTask 等)使用 Session.getActiveSession() 访问会话:

Session session = Session.getActiveSession();
if(session!=null && session.isOpened()) {
    Request.executeMyFriendsRequestAsync(session, new Request.GraphUserListCallback() {

        @Override
        public void onCompleted(List<GraphUser> users, Response response) {
            for(GraphUser u : users) {
                Log.d(TAG, ""+u.getId()+ ": " + u.getName());
            }
        }

    });
}

所以在我看来,Facebook 的 Session 类给了你想要的东西(访问活动会话“单例样式”)

高温高压

于 2013-03-19T01:31:19.340 回答