代号为一个FB身份验证

时间:2017-10-11 14:25:42

标签: facebook codenameone

我一直在使用以下代码

String clientId = "1171134366245722";
String redirectURI = "http://www.codenameone.com/";
String clientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
Login fb = FacebookConnect.getInstance();
fb.setClientId(clientId);
fb.setRedirectURI(redirectURI);
fb.setClientSecret(clientSecret);
//Sets a LoginCallback listener
fb.setCallback(...);
//trigger the login if not already logged in
if(!fb.isUserLoggedIn()){
    fb.doLogin();
} else {
    //get the token and now you can query the facebook 
    String token = fb.getAccessToken().getToken();
    ...
}

登录到facebook帐户后,它直接将我带到代码中指定的sendRedirectURI(XXX),并且回调函数不起作用。我需要运行setcallback(),我该如何实现?

1 个答案:

答案 0 :(得分:1)

Facebook登录工作有几件事要做。

您需要定义要获取的数据类型。最好的方法是创建一个UserData接口并在您的类中实现它:

public interface UserData {

    public String getId();

    public String getEmail();

    public String getFirstName();

    public String getLastName();

    public String getImage();

    public void fetchData(String token, Runnable callback);
}

然后像这样实现:

class FacebookData implements UserData {

    String id;
    String email;
    String first_name;
    String last_name;
    String image;

    @Override
    public String getId() {
        return id;
    }

    @Override
    public String getEmail() {
        return email;
    }

    @Override
    public String getFirstName() {
        return first_name;
    }

    @Override
    public String getLastName() {
        return last_name;
    }

    @Override
    public String getImage() {
        return image;
    }

    @Override
    public void fetchData(String token, Runnable callback) {
        ConnectionRequest req = new ConnectionRequest() {
            @Override
            protected void readResponse(InputStream input) throws IOException {
                try {
                    JSONParser parser = new JSONParser();
                    Map<String, Object> parsed = parser.parseJSON(new InputStreamReader(input, "UTF-8"));
                    id = (String) parsed.get("id");
                    email = (String) parsed.get("email");
                    first_name = (String) parsed.get("first_name");
                    last_name = (String) parsed.get("last_name");
                    image = (String) ((Map) ((Map) parsed.get("picture")).get("data")).get("url").toString();
                } catch (Exception ex) {
                }
            }

            @Override
            protected void postResponse() {
                callback.run();
            }

            @Override
            protected void handleErrorResponseCode(int code, String message) {
                if (code >= 400 && code <= 410) {
                    doLogin(FacebookConnect.getInstance(), FacebookData.this, true);
                    return;
                }
                super.handleErrorResponseCode(code, message);
            }
        };
        req.setPost(false);
        req.setUrl("https://graph.facebook.com/v2.10/me");
        req.addArgumentNoEncoding("access_token", token);
        req.addArgumentNoEncoding("fields", "id,email,first_name,last_name,picture.width(512).height(512)");
        NetworkManager.getInstance().addToQueue(req);
    }
}

让我们创建一个包含doLogin()

setCallback()方法
void doLogin(Login lg, UserData data, boolean forceLogin) {
    if (!forceLogin) {
        if (lg.isUserLoggedIn()) {
            //process Facebook login with "data" here
            return;
        }

        String token = Preferences.get("token", (String) null);

        if (getToolbar() != null && token != null) {
            long tokenExpires = Preferences.get("tokenExpires", (long) -1);
            if (tokenExpires < 0 || tokenExpires > System.currentTimeMillis()) {
                data.fetchData(token, () -> {
                    //process Facebook login with "data" here
                });
                return;
            }
        }
    }

    lg.setCallback(new LoginCallback() {
        @Override
        public void loginFailed(String errorMessage) {
            Dialog.show("Error Logging In", "There was an error logging in with Facebook: " + errorMessage, "Ok", null);
        }

        @Override
        public void loginSuccessful() {
            data.fetchData(lg.getAccessToken().getToken(), () -> {
                Preferences.set("token", lg.getAccessToken().getToken());
                Preferences.set("tokenExpires", tokenExpirationInMillis(lg.getAccessToken()));
                //process Facebook login with "data" here
            });
        }
    });
    lg.doLogin();
}

long tokenExpirationInMillis(AccessToken token) {
    String expires = token.getExpires();
    if (expires != null && expires.length() > 0) {
        try {
            long l = (long) (Float.parseFloat(expires) * 1000);
            return System.currentTimeMillis() + l;
        } catch (NumberFormatException ex) {
        }
    }
    return -1;
}

最后,在doLogin()

之后致电fb.setClientSecret()
String clientId = "1171134366245722";
String redirectURI = "http://www.codenameone.com/";
String clientSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
Login fb = FacebookConnect.getInstance();
fb.setClientId(clientId);
fb.setRedirectURI(redirectURI);
fb.setClientSecret(clientSecret);
doLogin(fb, new FacebookData(), false);