我正在为我的android应用程序开发facebook集成,为了减少麻烦,我正在尝试创建一个singleton类,将facebook逻辑与我应用程序的主逻辑分离开来。
我希望能够从应用程序的不同部分(入口点、异步任务…)调用这个类。此时,我首先调用initialize函数,并将applicationContext作为上下文。在初始化之后,我希望能够调用例如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;
            }
        }
    }
}

QueryPart工作得很好,但是会话没有。例如,如果我调用login函数,活动会话为空,但是我在应用程序的入口点用applicationContext初始化了会话。
具体地说,我有个问题:
这是跟踪会话状态的“好”方法吗?可以这样做吗?如果是的话,我做错了什么,就是没用?
作为后续问题:
如果不是,那么在应用程序生命周期期间或者应用程序会话之间跟踪会话的正确方法是什么?
提前谢谢。

最佳答案

我不能百分之百地肯定我理解这个问题,但是以下几点对我有用:
在某个活动中:

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());
        }
    }
});

然后,在其他地方(不同的活动、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类给了你想要的东西(访问活动会话“singleton风格”)。
高温高压

关于android - Facebook session 单例使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14969506/

10-12 04:26
查看更多