2013-03-28 33 views
0

我正在嘗試使用sdk 3.0在Facebook上發佈圖像,但我遇到了一些問題。如果我關閉應用程序並重新打開應用程序,它總是處於其他狀態,然後在有條件的情況下進入。我需要保存session還是已經存儲?有時無法上傳照片在臉書3.0?

  Session mSession = Session.getActiveSession(); 

    if (mSession != null 
      && mSession.getPermissions().contains("publish_actions")) { 
     postPhoto(); 

    } else { 

     if (mSession == null) { 

      Log.d("Facebook", "Session null"); 
      mSession = new Session.Builder(this).setApplicationId(
        "xxxxxxxxxxxxxxx").build(); 
      Session.setActiveSession(mSession); 

     } 
     if (!mSession.isOpened()) { 

      Log.d("Facebook", "Session not opened"); 

      Session.OpenRequest sessionRequest = new Session.OpenRequest(
        this); 

      sessionRequest.setPermissions(PERMISSIONS); 
      sessionRequest.setCallback(statuscallback); 
      sessionRequest 
        .setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); 
      mSession.openForPublish(sessionRequest); 

     } 

    } 

StatusCallback statuscallback = new StatusCallback() { 

     @Override 
     public void call(Session session, SessionState state, 
       Exception exception) { 
      // TODO Auto-generated method stub 

      if (session.isOpened()) { 

       Log.d("Facebook", "Logged in"); 
       postPhoto(); 

      } 
      if (session.isClosed()) { 

       Log.d("Facebook", "Logged out"); 
      } 
     } 
    }; 



    @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      Session.getActiveSession().onActivityResult(this, requestCode, 
        resultCode, data); 

      Log.d("Facebook", "onActivity Result"); 
     } 

如果我需要註銷用戶?

我嘗試以下代碼的onDestroy()

if (mSession.isOpened()) 
    mSession.closeAndClearTokenInformation(); 

每當我打開如果使用上面的代碼中破壞方法它總是在這條線會引發錯誤的應用程序下一次

mSession.openForPublish(sessionRequest); 

請幫助傢伙。答案/建議將非常可觀。

感謝

回答

0

可以使用UiLifecycleHelper幫助在整個活動或片段生命週期管理活動的會話。通常,所有會話相關數據(訪問令牌,權限等)都被緩存,並且如果您創建了新的Session(),它將使用緩存的數據(除非您調用closeAndClearTokenInformation,在這種情況下它將清除緩存)。我只會從用戶的顯式註銷中調用closeAndClearTokenInformation(),否則只需在onDestroy()中調用close()。

我也會避免調用openForPublish。總是執行openForRead,然後調用session.getPermissions()檢查是否擁有必要的權限,然後在需要更多時調用requestNewPublishPermissions。

+0

你能通過代碼顯示我嗎?想要發佈照片,那麼爲什麼需要'openForRead'而不是'openForPublish' – ronie

+0

SDK附帶的示例應用程序是如何使用UiLifecycleHelper以及Scrumptious應用程序(在SelectionFragment.java中)的最佳示例,其中包含示例關於如何請求發佈權限。 –

+0

你不應該直接調用openForPublish的原因是因爲它只在用戶已經給你基本(默認)權限的情況下才起作用。 –