[英]Facebook android SDK reopens session
I am developing a facebook-integrated application and i am experiencing a very weird issue. 我正在开发一个与Facebook集成的应用程序,但遇到一个很奇怪的问题。
I log in normally, but as i am about to log out the SDK forces a login again... 我正常登录,但是由于我即将注销,SDK会再次强制登录...
package com.machinarius.facebook;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.facebook.Request;
import com.facebook.Request.GraphUserCallback;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.Session.NewPermissionsRequest;
import com.facebook.Session.StatusCallback;
import com.facebook.SessionState;
import com.facebook.model.GraphUser;
public class MainActivity extends Activity implements StatusCallback, GraphUserCallback {
private TextView statusText;
private Button loginButton;
private Boolean loggedIn;
private Session actualSession;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loggedIn = false;
statusText = (TextView)findViewById(R.id.statusText);
loginButton = (Button)findViewById(R.id.loginButton);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
public void toggleFacebookLogin(View source) {
if(!loggedIn) {
actualSession = Session.openActiveSession(this, true, this);
}
else
if(actualSession == null)
return;
else {
actualSession.close();
statusText.setText("Please login");
loggedIn = false;
}
}
@Override
public void call(Session session, SessionState state, Exception exception) {
if(state.equals(SessionState.OPENED)) {
loggedIn = true;
List<String> permissions = getNewPermissions(actualSession.getPermissions(),
new LinkedList<String>(Arrays.asList("user_about_me", "user_birthday", "user_hometown", "user_relationships", "user_location", "user_relationships", "email")));
Session.NewPermissionsRequest permissionsRequest = new NewPermissionsRequest(this, permissions);
actualSession.requestNewReadPermissions(permissionsRequest);
populateInterface();
} else {
loggedIn = false;
}
}
private void populateInterface() {
Request.executeMeRequestAsync(Session.getActiveSession(), this);
}
@Override
public void onCompleted(GraphUser user, Response response) {
if(response.getError() != null) {
statusText.setText("There was an error fetching your info");
Log.e(getClass().getName(), response.getError().toString());
return;
}
if(user != null) {
statusText.setText("Hello " + user.getName() + "\n"
+ "Your user ID is " + user.getId() + "\n"
+ "Your birthday is " + user.getBirthday());
loginButton.setText("Log out");
} else {
statusText.setText("There was an error fetching your info");
}
}
private List<String> getNewPermissions(List<String> actualPermissions, List<String> desiredPermissions) {
ArrayList<String> permissionsGranted = new ArrayList<String>();
for(String nPermission : desiredPermissions)
for(String aPermission : actualPermissions)
if(nPermission.equals(aPermission))
permissionsGranted.add(nPermission);
for(String gPermission : permissionsGranted)
desiredPermissions.remove(gPermission);
return desiredPermissions;
}
}
toggleFacebookLogin is called by a XML onClick handler on the loginButton. toggleFacebookLogin由loginButton上的XML onClick处理程序调用。
Another question as well, how can i integrate the permissions request into the session.open call so i dont have to make the user see a facebook dialog twice? 还有另一个问题,我如何将权限请求集成到session.open调用中,这样我就不必让用户两次看到Facebook对话框?
The problem here is that you're only checking for 这里的问题是您只在检查
state.equals(SessionState.OPENED)
in your call
method rather than 在您的
call
方法而不是
state.isOpened()
So when you request additional permissions, the state actually transitions to OPENED_TOKEN_UPDATED, and now your loggedIn state is false (even though it should be true). 因此,当您请求其他权限时,状态实际上会转换为OPENED_TOKEN_UPDATED,现在您的loginIn状态为false(即使应该为true)。 So when you click the button, you're calling openActiveSession again because your loggedIn state is incorrect.
因此,当您单击按钮时,由于登录状态不正确,因此再次调用openActiveSession。 If you switch to checking
state.isOpened()
, it should fix your issue. 如果切换到检查
state.isOpened()
,它将解决您的问题。
To answer your second question, since you're only requesting read permissions, you can request them all at once when you open the session (whereas if you also wanted to request publish permissions - like publish_stream, then you'd need to separate the requests). 要回答第二个问题,由于您仅请求读取权限,因此可以在打开会话时一次全部请求它们(而如果您还想请求发布权限,例如publish_stream,则需要将请求分开)。 To do it all at once, you need to replace your
Session.openActiveSession(this, true, this)
with something like: 要一次完成所有操作,您需要使用以下内容替换
Session.openActiveSession(this, true, this)
:
Session actualSession = new Session(this);
Session.setActiveSession(actualSession);
actualSession.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("some", "read", "permissions")).setCallback(this));
Note: I wrote the above off the top of my head, so there might be syntax errors. 注意:我在脑海中写下了以上内容,因此可能存在语法错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.