简体   繁体   English

Facebook android SDK重新打开会话

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM