2013-01-22 47 views
5

我正試圖將新的Facebook SDK 3.0實施到我的Android應用程序中,並且遇到了問題。我遇到的問題是,要求用戶再次登錄才能發佈(「post_to_wall」)權限,即使用戶已經登錄,但具有讀取權限。只有當用戶沒有安裝FB應用程序時纔會發生這種情況。如果他安裝了FB應用程序,那麼他只會被要求授予權限。重新授權期間要求用戶提供登錄憑證

這是我如何實現登錄:

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

    if (session == null || !session.isOpened()) { 
     openActiveSession(activity, true, sessionStatusCallback); 
    } 
} 

private Session openActiveSession(final Activity activity, final boolean allowLoginUI, final StatusCallback callback) { 
    return openActiveSession(activity, allowLoginUI, new OpenRequest(activity).setCallback(callback)); 
} 

private Session openActiveSession(final Context context, final boolean allowLoginUI, final OpenRequest openRequest) { 
    Session session = new Builder(context).setApplicationId(FACEBOOK_APPLICATION_ID).build(); 
    if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) { 
     Session.setActiveSession(session); 
     session.openForRead(openRequest); 
     return session; 
    } 
    return null; 
} 

這是回調的調用方法:

public void call(final Session session, final SessionState state, final Exception exception) { 
    if (session.isOpened()) { 
     if (state.equals(SessionState.OPENED_TOKEN_UPDATED)) { 
      // code if new permissions have been granted 
     } else { 
      // code for login 
     } 
    } else if (session.isClosed()) { 
      // code for user canceled login 
     } else if (exception != null) { 
      // code if there were errors during login 
     } 
    } 
} 

這是我加入到調用登錄活動的onActivityResult方法的代碼:

Session.getActiveSession().onActivityResult(activity, requestCode, resultCode, data); 

這就是我要求的新權限:

Session session = Session.getActiveSession(); 
if (session != null && session.isOpened()) {  
    if (DONT_HAVE_PERMISSIONS) { 
     Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity, 
          FACEBOOK_PERMISSIONS).setRequestCode(FACEBOOK_AUTHORIZE_ACTIVITY_CODE); 
     session.requestNewPublishPermissions(newPermissionsRequest); 
    } 
} 

我試圖找出更多關於這個問題,我只發現了一些提示,這是打算,但我還沒有發現任何具體。

這是默認行爲嗎?如果是這樣,是否有解決方法?或者,也許我做錯了什麼?

感謝您的幫助。

回答

0

看着Facebook的源代碼我認爲它應該有可能開始嘗試直接獲取權限,因爲登錄和權限類派生自相同的AuthorizationRequest類,而AuthorizationRequest類可以完成所有工作,工作。 Session.NewPermissionsRequest類只是創建一些私有方法,在AuthorizationRequest類中公開,就是這樣!他們可能會讓我們直接訪問AuthorizationRequest。新的Facebook API似乎沒有任何形式的「OnFailed/OnSuccess」回調,所以我最終擁有一臺狀態機來記住啓動Facebook的目標(登錄,權限,獲取好友列表...),以及哪一步我在。如果他們已經完成了onFailed/onSuccess回調的某種形式,那麼創建一個鏈而不是跟蹤一個狀態機很容易。

我還沒有嘗試過我所說的。如果我這樣做,我會更新答案。如果你嘗試,它只是直接啓動Session.NewPermissionsRequest而不登錄讓我知道!

更新

我得到了它,因爲我上面所解釋只要求一次憑據工作。

  1. 轉到SRC/COM/Facebook的/ Sessions.java
  2. 線862,你會發現

    private static Session openActiveSession(Context context, boolean allowLoginUI, OpenRequest openRequest) 
    
  3. 使它成爲一個公共職能和保存。

現在不是創建Session.NewPermissionsRequest對象。開會。OpenRequest

 permisions = new ArrayList<String>(); 
     permisions.add("user_photos"); 
     permisions.add("friends_photos"); 
     Session.NewPermissionsRequest request = new Session.NewPermissionsRequest(
       activity, permisions); 
     request.setCallback(helper); 

     if (Session.getActiveSession() != null) 
      Session.getActiveSession().requestNewReadPermissions(request); 
     else { 
      Session.OpenRequest orequest = new Session.OpenRequest(activity); 
      orequest.setPermissions(permisions); 
      orequest.setCallback(helper); 
          // its now public so you can call it 
      Session.openActiveSession(act, true, request); 
     } 

現在確保你設置回調,一個重要的原因

@Override 
public void call(Session session, SessionState state, Exception exception) { 
    if (state.isClosed()) { 
        // we are doing unofficial stuff so we loose guarantees. 
        // Set the active session to null if we logout or user cancels 
        // logging in. If you don't do this, the second time it will result 
        // in a crash. 
     Session.setActiveSession(null); 
    } 
} 

現在它將會直接詢問所有權限和一次性登錄。