我正在開發與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'狀態。 我該怎麼做?
基本上,我已經注意到的是,只有「打開」和「opened_token_updated」狀態被調用。 「打開」時,即表示您授權首次被調用,同時,這樣做的授權,第二次或「許可的不同列表重新授權」,「opened_token_updated」之稱。 是的,請勿混用的讀寫權限。他們是單獨的 –