2012-12-26 72 views
-1

我正在開發與Facebook的SDK 3.0新的Android應用程序。 我知道,我不能同時申請兩種權限,並在登錄按鈕不能要求寫權限(publish_stream,publish_acition..etc)在Facebook的政策。我怎樣才能順序獲得兩個權限?

所以,我的問題是,我怎麼能要求「publish_stream」權限的用戶登錄點擊按鈕後,會自動?

在下面我的源代碼

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 

    if (state.isOpened()) { 

     if (pendingPublishReauthorization && state.equals(SessionState.OPENED_TOKEN_UPDATED)) { 
      pendingPublishReauthorization = false; 
      publishFeed(userName); 
     } 

     m_pd.show(); 
     Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 

      @Override 
      public void onCompleted(GraphUser user, Response response) { 
       if (user != null) { 

        String username=buildUserInfoDisplay(user); 
        userName=username; 
        saveAccount(username, "facebook"); 

        Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "login success"); 
        publishFeed(userName); 
        m_pd.dismiss(); 

        //Activity GetActivity=getActivity(); 
        //if(GetActivity != null) GetActivity.finish(); 


       } 
      } 
     }); 

    } else if (state.isClosed()) { 
     Log.i(com.dress.folio.Constants.FACEBOOK_TAG, "Logged out..." + exception); 
    } 
} 

當用戶點擊登錄按鈕,onSessionStateChange()被調用。所以我嘗試後Request.executeMeRequestAsync(會話,新Request.GraphUserCallback()要求 'publish_stream' 與 'publishFeed()'

Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 
      @Override 
      public void onCompleted(GraphUser user, Response response) { 
       if (user != null) { 

        String username=buildUserInfoDisplay(user); 
        userName=username; 
        saveAccount(username, "facebook"); 

        Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "login success"); 
        publishFeed(userName); 
        m_pd.dismiss(); 

        //Activity GetActivity=getActivity(); 
        //if(GetActivity != null) GetActivity.finish(); 

       } 
      } 
     }); 

publishFeed()是這樣的:。

private void publishFeed(String username) { 
    Session session = Session.getActiveSession(); 
    SessionState state= session.getState(); 

    if (session != null){ 
     Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "in publishstory(): "+ state); 
     // Check for publish permissions  
     List<String> permissions = session.getPermissions(); 
     if (!isSubsetOf(PERMISSIONS, permissions)) { 

      pendingPublishReauthorization = true; 
      if(state == SessionState.OPENED_TOKEN_UPDATED) { 
       Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "in publishstory() if : OPENED_TOKEN_UPDATED"); 
       Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSIONS); 
       session.requestNewPublishPermissions(newPermissionsRequest); 
      } 

      return; 
     } 

     Bundle postParams = new Bundle(); 
     postParams.putString("name", username + " is logged in"); 
     // postParams.putString("caption", "Build great social apps and get more installs."); 
     postParams.putString("description", "get the dress!!"); 
     postParams.putString("link", "https://www.facebook.com/pages/Dressfolio/183665935091337"); //dressfolio facebook page address 
     postParams.putString("picture", "https://MY_APPLICATION.com/asset/facebook/app1/thumb2.png"); //thumbnail 


     Request.Callback callback= new Request.Callback() { 
      public void onCompleted(Response response) { 
       Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "callback()"); 

       FacebookRequestError error = response.getError(); 
       if (error != null) { 
        Log.d(com.dress.folio.Constants.FACEBOOK_TAG,"news feed error!" + error.toString());  
       } 
       else { 
        Log.d(com.dress.folio.Constants.FACEBOOK_TAG, "News Feed Posting success()"); 
       } 
      } 
     }; 

     Request request = new Request(session, "me/feed", postParams, 
       HttpMethod.POST, callback); 

     RequestAsyncTask task = new RequestAsyncTask(request); 
     task.execute(); 


    } 


} 

但這總是不起作用,因爲Sessionstate不處於'OPENED_TOKEN_UPDATED'狀態。 我該怎麼做?

回答

0

您可以一次請求多個權限,但您不能將READ和PUBLISH權限混合在同樣的要求

爲了您的具體問題,這是因爲你檢查SessionState.OPENED_TOKEN_UPDATED,而當會話第一次打開,它在SessionState.OPENED狀態。只有當您請求額外的權限時,纔會轉換到OPENED_TOKEN_UPDATED狀態。

+0

基本上,我已經注意到的是,只有「打開」和「opened_token_updated」狀態被調用。 「打開」時,即表示您授權首次被調用,同時,這樣做的授權,第二次或「許可的不同列表重新授權」,「opened_token_updated」之稱。 是的,請勿混用的讀寫權限。他們是單獨的 –