2013-02-19 63 views
2

我正在爲我的Android應用程序的Facebookintegration和減少麻煩,我試圖創建一個單例類來分離我的應用程序的主邏輯Facebook的邏輯。Facebook會話單例使用

我希望能夠從我的應用程序的不同部分調用此類(入口點,asynctasks,...)。此時,我首先使用applicationcontext作爲上下文調用初始化函數。在初始化之後,我希望能夠調用例如。 FacebookSession.getInstance().login()FacebookSession.getInstance().requestWithQuery(examplestring)

問題是我找不到像樣的文檔。即使臉譜官方樣本使用舊的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; 
      } 
     } 
    } 
} 

的queryingpart作品非常簡潔,但會議沒有。例如,如果我調用登錄函數,則活動會話爲空,但是我在應用程序的入口點使用applicationcontext初始化了會話。

混凝土,我有這樣的疑問:

  • 這是(嘗試)來跟蹤會話狀態的「好」的方式?可以這樣做嗎?如果是這樣,我做錯了,它只是不工作?

而作爲一個後續問題:

  • 如果不是,那麼什麼是跟蹤會話的過程中,可以應用生命時間以正確的方式和以其他方式應用程序會話之間?

在此先感謝。

回答

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

,然後在其他地方(不同的活動,的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給你想要的東西(進入活動會話「單式」)

HTH

+0

你說得對,Session對象確實是作爲一個單身,我莫名其妙地忽略了這一點。謝謝! – Silox 2013-03-19 11:57:50

+0

當然可以。如果它適合你,你會考慮接受答案嗎? – 2013-03-22 21:42:58