行动这个Android应用程序的流量 -
在UserX登记在Facebook 在UserX授予read_permissions 在UserX授予publish_permissions 在他的access_token被存储在数据库中。UserX注销
UserY寄存器... [遵循相同的步骤]
由于它需要多个用户登录,我需要SUP preSS_SSO(感谢How禁用单点登录Facebook的Android应用?)。
现在在Facebook的API 3.0,Facebook已经取得了ReadPermissions和PublishPermissions不同。 我成功地要求这两个权限,但它要求用户登录两次(因为SSO是燮pressed,显示的WebView) - 登录的WebView弹出再次 - 用户拥有就摆在他的电子邮件和密码。 我要访问的PublishPermissions,或ReadPermissions(以任意顺序),而不必重新输入自己的密码。
从Java code相关的功能如下所示:
私有静态最后的名单,其中,字符串> PERMISSIONS = Arrays.asList(user_photos,read_friendlists,电子邮件,publish_actions,publish_stream);
私人无效的UpdateView(){
会话会话= Session.getActiveSession();
如果(session.isOpened()){
handleAnnounce();
textInstructionsOrLink.setText(ACKNOWLEDGE_USER);
buttonLoginLogout.setText(R.string.logout);
buttonLoginLogout.setOnClickListener(新OnClickListener(){
公共无效的onClick(视图查看){
onClickLogout();
}
});
} 其他 {
textInstructionsOrLink.setText(R.string.login);
buttonLoginLogout.setText(R.string.login);
buttonLoginLogout.setOnClickListener(新OnClickListener(){
公共无效的onClick(视图查看){
onClickLogin();
}
});
}
}
私人无效onClickLogin(){
会话会话= Session.getActiveSession();
如果(session.isOpened()及!&安培;!session.isClosed()){
Session.OpenRequest openRequest =新Session.OpenRequest(本).setCallback(statusCallback);
名单<字符串> readPermissions = Arrays.asList(user_photos,电子邮件,read_friendlists);
openRequest.setPermissions(readPermissions);
openRequest.setLoginBehavior(SessionLoginBehavior.SUP preSS_SSO);
session.openForRead(openRequest);
} 其他 {
Session.openActiveSession(这一点,真,statusCallback);
}
}
私人无效requestPublishPermissions(会话的会话){
Log.d(LOG_TAG,请求发布权限......);
如果(会话!= NULL){
名单<字符串> publishPermissions = Arrays.asList(publish_actions,publish_stream);
最终诠释REAUTH_ACTIVITY_ code = 100;
Session.NewPermissionsRequest reauthRequest =新Session.NewPermissionsRequest(这一点,publishPermissions).setRequest code(REAUTH_ACTIVITY_ code);
reauthRequest.setLoginBehavior(SessionLoginBehavior.SUP preSS_SSO);
session.requestNewPublishPermissions(reauthRequest);
}
}
私人无效handleAnnounce(){
会话会话= Session.getActiveSession();
如果(会话== NULL ||!session.isOpened()){
返回;
}
名单<字符串>权限= session.getPermissions();
如果(!permissions.containsAll(权限)){
requestPublishPermissions(会议);
返回;
}
}
解决方案
您code似乎是美好的,它是一个API的缺陷最近报道:
的https://developers.facebook.com/bugs/268146283318403?browse=search_51235ada57ba59615000124
只是耐心,我已经得到了同样的错误,我们所能做的就是等待一个固定的API。
The flow of action on this android app is -
UserX registers on facebook UserX grants read_permissions UserX grants publish_permissions His access_token is stored in our database.UserX logs out
UserY registers ... [follows same steps]
Since it requires login of multiple users I need to SUPPRESS_SSO (thanks to How to disable Single SIgn On for facebook android app?).
Now in facebook API 3.0, Facebook has made ReadPermissions and PublishPermissions different. I am succesfully asking for both the permissions, but it requires the user to login twice (since SSO is suppressed and webview is displayed) - the login webview pops up once again - the user has to put in his email and password. I want to access the PublishPermissions, or the ReadPermissions (in any order) without the user having to retype his password.
Relevant functions from the java code is shown here:
private static final List<String> PERMISSIONS = Arrays.asList("user_photos", "read_friendlists", "email", "publish_actions", "publish_stream");
private void updateView() {
Session session = Session.getActiveSession();
if (session.isOpened()) {
handleAnnounce();
textInstructionsOrLink.setText(ACKNOWLEDGE_USER);
buttonLoginLogout.setText(R.string.logout);
buttonLoginLogout.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
onClickLogout();
}
});
} else {
textInstructionsOrLink.setText(R.string.login);
buttonLoginLogout.setText(R.string.login);
buttonLoginLogout.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
onClickLogin();
}
});
}
}
private void onClickLogin() {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
Session.OpenRequest openRequest = new Session.OpenRequest(this).setCallback(statusCallback);
List<String> readPermissions = Arrays.asList("user_photos", "email", "read_friendlists");
openRequest.setPermissions(readPermissions);
openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
session.openForRead(openRequest);
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
private void requestPublishPermissions(Session session) {
Log.d(LOG_TAG, "Requesting Publish Permissions...");
if (session != null) {
List<String> publishPermissions = Arrays.asList("publish_actions", "publish_stream");
final int REAUTH_ACTIVITY_CODE = 100;
Session.NewPermissionsRequest reauthRequest = new Session.NewPermissionsRequest(this, publishPermissions).setRequestCode(REAUTH_ACTIVITY_CODE);
reauthRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
session.requestNewPublishPermissions(reauthRequest);
}
}
private void handleAnnounce() {
Session session = Session.getActiveSession();
if (session == null || !session.isOpened()) {
return;
}
List<String> permissions = session.getPermissions();
if (!permissions.containsAll(PERMISSIONS)) {
requestPublishPermissions(session);
return;
}
}
解决方案
Your code seems to be fine, it's an API's bug recently reported:
https://developers.facebook.com/bugs/268146283318403?browse=search_51235ada57ba59615000124
Just patience, I've got the very same error and all we can do is wait for a fixed API.