2013-12-17 166 views
0

現在我必須在用戶牆上實現共享狀態的代碼。
第一次。用戶已通過點擊「打開fb」按鈕接受我的應用的許可。不過,他們之後在他們的Facebook應用中刪除了我的應用。接下來,他們點擊「關閉fb」按鈕並再次點擊「打開fb」按鈕。 - >實際:此按鈕在沒有任何請求權限對話框的情況下打開。 - >期望:該按鈕必須關閉,並且必須顯示請求權限對話框。當用戶在Facebook應用程序中刪除我們的應用程序時,Facebook需要重新登錄

public void loginFragment(final ILoginFacebook loginFacebook) { 
    Session.openActiveSession(mContext, mFragment, true, 
     new StatusCallback() { 
      //to only confirm permission one time 
      private boolean isRequestPublishPermission = false; 
      @Override 
      public void call(Session session, SessionState state, 
        Exception exception) { 
       if (state.isOpened()) { 
        if (!isSubsetOf(mFacebookPermission.getPermissions(), 
          session.getPermissions())) { 
         if (!isRequestPublishPermission) { 
          session.requestNewPublishPermissions(new NewPermissionsRequest(
           mFragment, 
           mFacebookPermission.getPermissions())); 
          isRequestPublishPermission = true; 
         } else { 
          loginFacebook.onLoginFBFailure(); 
         } 
        } else { 
         loginFacebook.onLoginFBSuccess(); 
        } 
       } else { 
        int numCurrentPer = session.getPermissions().size(); 
        int numOldPer = Session.getActiveSession().getPermissions().size(); 
        if(numCurrentPer < numOldPer){ 
         session.closeAndClearTokenInformation(); 
         isRequestPublishPermission = false; 
        } 
        loginFacebook.onLoginFBFailure(); 
       } 
      } 
     }); 
} 

我設置了一些日誌來檢查數據回調。在最後的請求。會話,一直到舞臺{iOpened()== true}並且列表權限已滿。

+0

會話(連同訪問令牌和權限)在本地緩存在設備上,所以直到您嘗試發出請求時,它纔會被更新。通常情況下,您可以在打開會話後向「/ me」或「/ me/permissions」發出請求,如果用戶從Facebook上刪除了您的應用,則會返回錯誤並關閉會話。 –

+0

很抱歉,當我谷歌「/我/權限」或「/我」,它顯示我沒有結果...請幫助我。 –

回答

1

通常,在用戶最初授予您的應用權限後,會話在設備上本地緩存。之後,除非您明確地調用session.closeAndClearTokenInformation,否則它將使用緩存的信息。

這意味着您不會知道令牌是否仍然有效,直到您向Facebook發出請求(這可能來自用戶從FB中刪除您的應用或更改其FB密碼或其他類似場景)。

有幾種方法可以解決這個問題。一種是像往常一樣繼續使用應用程序,當您向Graph API發出請求時,處理返回的錯誤(請參閱this page的處理錯誤部分)。

另一種是使Facebook的請求你打開會話之後,這可能是一個「/我」的要求:如果用戶已刪除了您的應用程序

Request meRequest = Request.newMeRequest(session, callback); 
meRequest.executeAsync(); 

,那麼這個請求將錯誤出來,你應該使用上面鏈接的錯誤處理策略來處理它。

相關問題