Facebook android SDK重新启动会话

Facebook android SDK重新启动会话,android,facebook,Android,Facebook,我正在开发一个facebook集成应用程序,我遇到了一个非常奇怪的问题 我正常登录,但当我即将注销时,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.con

我正在开发一个facebook集成应用程序,我遇到了一个非常奇怪的问题

我正常登录,但当我即将注销时,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;
    }
}
package com.machinarius.facebook;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.LinkedList;
导入java.util.List;
导入android.app.Activity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入com.facebook.Request;
导入com.facebook.Request.GraphUserCallback;
导入com.facebook.Response;
导入com.facebook.Session;
导入com.facebook.Session.newpermissions请求;
导入com.facebook.Session.StatusCallback;
导入com.facebook.SessionState;
导入com.facebook.model.GraphUser;
公共类MainActivity扩展活动实现StatusCallback、GraphUserCallback{
私有文本查看状态文本;
私人按钮登录按钮;
私有布尔loggedIn;
非公开会议;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loggedIn=false;
statusText=(TextView)findViewById(R.id.statusText);
loginButton=(按钮)findViewById(R.id.loginButton);
}
@凌驾
ActivityResult上的公共void(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
Session.getActiveSession().onActivityResult(此、请求代码、结果代码、数据);
}
public void toggleFacebookLogin(查看源){
如果(!loggedIn){
actualSession=Session.openActiveSession(this,true,this);
}
其他的
如果(actualSession==null)
返回;
否则{
actualSession.close();
statusText.setText(“请登录”);
loggedIn=false;
}
}
@凌驾
公共无效调用(会话、会话状态、异常){
if(state.equals(SessionState.OPENED)){
loggedIn=true;
列表权限=getNewPermissions(actualSession.getPermissions(),
新的LinkedList(Arrays.asList(“用户关于我”、“用户生日”、“用户家乡”、“用户关系”、“用户位置”、“用户关系”、“电子邮件”));
Session.NewPermissionsRequestPermissionsRequest=新建permissionsRequest(此,权限);
actualSession.requestNewReadPermissions(permissionsRequest);
populateInterface();
}否则{
loggedIn=false;
}
}
私有void populateInterface(){
Request.executeRequestAsync(Session.getActiveSession(),this);
}
@凌驾
未完成公共无效(GraphUser用户,响应){
if(response.getError()!=null){
statusText.setText(“获取信息时出错”);
Log.e(getClass().getName(),response.getError().toString());
返回;
}
如果(用户!=null){
statusText.setText(“Hello”+user.getName()+”\n”
+您的用户ID为“+user.getId()+”\n
+“您的生日是”+user.getBirthday());
loginButton.setText(“注销”);
}否则{
statusText.setText(“获取信息时出错”);
}
}
私有列表getNewPermissions(列出实际权限,列出所需权限){
ArrayList permissionsGranted=新建ArrayList();
for(字符串n权限:desiredPermissions)
用于(字符串传输:实际许可)
if(许可等于(个人))
许可授权添加(nPermission);
for(字符串gPermission:permissionsGranted)
desiredPermissions.remove(gPermission);
返回所需的权限;
}
}
toggleFacebookLogin由loginButton上的XML onClick处理程序调用


还有一个问题,我如何将权限请求集成到会话中。open call这样我就不必让用户看到facebook对话框两次了?

这里的问题是,您只需要检查

state.equals(SessionState.OPENED)
方法中调用
而不是

state.isOpened()
因此,当您请求其他权限时,状态实际上会转换为OPENED_TOKEN_UPDATED,而现在您的loggedIn状态为false(即使它应该为true)。因此,当您单击该按钮时,您再次调用openActiveSession,因为您的loggedIn状态不正确。如果切换到checking
state.isOpened()
,应该可以解决您的问题

要回答第二个问题,因为您只请求读取权限,所以可以在打开会话时一次请求所有这些权限(而如果您还想请求发布权限,如publish_stream,则需要将请求分开)。要同时完成这一切,您需要将
会话.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));

注意:我写了上面的内容,所以可能有语法错误。

这里的问题是,您只是在检查

state.equals(SessionState.OPENED)
方法中调用
而不是

state.isOpened()
因此,当您请求其他权限时,状态实际上会转换为OPENED_TOKEN_UPDATED,而现在您的loggedIn状态为false(即使它应该为true)。因此,当您单击该按钮时,您再次调用openActiveSession,因为您的loggedIn状态不正确。如果切换到checking
state.isOpened()
,应该可以解决您的问题

要回答第二个问题,因为您只请求读取权限,所以可以在打开会话时一次请求所有这些权限(而如果您还想请求发布权限,如publish_stream,则需要sepa)