Codenameone 代号one FacebookConnect

Codenameone 代号one FacebookConnect,codenameone,Codenameone,我目前正在尝试代号为1的跨平台移动应用程序开发,该应用程序需要社交登录。我试图介绍facebook登录,但它不起作用。我可能做错了什么 下面是我遇到错误的代码: public class MyApplication { private Form current; private Resources theme; private String tokenPrefix; private String fullName; private String uniq

我目前正在尝试代号为1的跨平台移动应用程序开发,该应用程序需要社交登录。我试图介绍facebook登录,但它不起作用。我可能做错了什么

下面是我遇到错误的代码:

public class MyApplication {

    private Form current;
    private Resources theme;
    private String tokenPrefix;
    private String fullName;
    private String uniqueId;
    private String imageURL;
    private static EncodedImage userPlaceholder;
    private EncodedImage roundPlaceholder;

    public void start() {
        if (current != null) {
            current.show();
            return;
        }

        Form facebook = new Form(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER));
        facebook.getTitleArea().setUIID("Container");

        Button connect = new Button("Login with facebook");

        Container c = BoxLayout.encloseY(connect);

        facebook.add(BorderLayout.CENTER, c);

        connect.addActionListener((evt) -> {
            /* tokenPrefix = "facebook";
                Login fb = FacebookConnect.getInstance();
                fb.setClientId("XXXXXXXXXXXXXXXXX");
                fb.setRedirectURI("http://localhost/callback");
                fb.setClientSecret("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
                doLogin(fb, new FacebookData(), false); */
            String clientId = "XXXXXXXXXXXXXXXXX";
            String redirectURI = "http://www.codenameone.com/";
            String clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            Login fb = FacebookConnect.getInstance();
            fb.setClientId(clientId);
            fb.setRedirectURI(redirectURI);
            fb.setClientSecret(clientSecret);
            Log.p("login event triggered");
            doLogin(fb, new FacebookData(), false);
            /* if(!fb.isUserLoggedIn()){
                       doLogin(fb, new FacebookData(),false);
                    }else{
                        //get the token and now you can query the facebook API
                        String token = fb.getAccessToken().getToken();
                                      } */
        });

        facebook.show();
    }

    void doLogin(Login lg, UserData data, boolean forceLogin) {
        if (!forceLogin) {
            if (lg.isUserLoggedIn()) {
                Log.p("Fetching data......");
                showContactsForm();
                return;
            }

            String t = Preferences.get(tokenPrefix + "token", (String) null);
            if (t != null) {
                long tokenExpires = Preferences.get(tokenPrefix + "tokenExpires", (long) -1);

                if (tokenExpires < 0 || tokenExpires > System.currentTimeMillis()) {
                    //we are still logged in 
                    Log.p("Fetching data......");
                    showContactsForm();
                    return;
                }
            }
        }
        lg.setCallback(new LoginCallback() {
            public void loginFailed(String errorMessage) {
                Log.p("Error occured");
                Dialog.show("Error Logging in", "There was an error logging in:" + errorMessage, "OK", null);
            }

            public void loginSuccessful() {
                Log.p("doLogin started");
                // when login is successful we fetch the full data
                data.fetchData(lg.getAccessToken().getToken(), () -> {
                    // we store the values of result into local variables
                    String uniqueId = data.getId();
                    String fullName = data.getName();
                    String imageURL = data.getImage();

                    // we then store the data into local cached storage so they will be around when we run the app next time
                    Preferences.set("fullName", fullName);
                    Preferences.set("uniqueId", uniqueId);
                    Preferences.set("imageURL", imageURL);
                    Preferences.set(tokenPrefix + "token", lg.getAccessToken().getToken());

                    // token expiration is in seconds from the current time, we convert it to a System.currentTimeMillis value so we can
                    // reference it in the future to check expiration
                    Preferences.set(tokenPrefix + "tokenExpires", tokenExpirationInMillis(lg.getAccessToken()));
                    showContactsForm();
                    Log.p("information fetched" + fullName + "_" + uniqueId + "_");
                });
            }
        });
        lg.doLogin();
    }

    long tokenExpirationInMillis(AccessToken token) {
        String expires = token.getExpires();
        if (expires != null && expires.length() > 0) {
            try {
                // when it will expire in seconds
                long l = (long) (Float.parseFloat(expires) * 1000);
                return System.currentTimeMillis() + l;
            } catch (NumberFormatException err) {
                // ignore invalid input
            }
        }
        return -1;
    }

    static interface UserData {

        public String getName();

        public String getId();

        public String getImage();

        public void fetchData(String token, Runnable callback);
        //  public ContactData[] getContacts();
    }

    class FacebookData implements UserData {

        String name;
        String id;
        String token;

        @Override
        public String getName() {
            return name;
        }

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

        @Override
        public String getImage() {
            return "http://graph.facebook.com/v2.8/" + id + "/picture";
        }

        @Override
        public void fetchData(String token, Runnable callback) {
            this.token = token;
            ConnectionRequest req = new ConnectionRequest() {
                @Override
                protected void readResponse(InputStream input) throws IOException {
                    JSONParser parser = new JSONParser();
                    Map<String, Object> parsed = parser.parseJSON(new InputStreamReader(input, "UTF-8"));
                    name = (String) parsed.get("name");
                    id = (String) parsed.get("id");
                }

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

                @Override
                protected void handleErrorResponseCode(int code, String message) {
                    //access token not valid anymore
                    if (code >= 400 && code <= 410) {
                        Log.p("error occured");
                        doLogin(FacebookConnect.getInstance(), FacebookData.this, true);
                        return;
                    }
                    super.handleErrorResponseCode(code, message);
                }
            };
            req.setPost(false);
            req.setUrl("https://graph.facebook.com/v2.8/me");
            req.addArgumentNoEncoding("access_token", token);
            NetworkManager.getInstance().addToQueue(req);
        }
    }

    void showContactsForm() {

        Form result = new Form(new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER_ABSOLUTE));
        Label fname = new Label("Hello");
        Label id = new Label("Facebook");

        Container c = BoxLayout.encloseY(fname, id);

        fname.setText(Preferences.get("fullName", fullName));
        id.setText(Preferences.get("uniqueId", uniqueId));

        result.add(BorderLayout.CENTER, c);
        result.show();
    }
}
公共类MyApplication{
私有形式电流;
私人资源主题;
私有字符串标记前缀;
私有字符串全名;
私有字符串唯一性;
私有字符串imageURL;
私有静态编码dimage用户占位符;
专用的占位符;
公开作废开始(){
如果(当前!=null){
current.show();
返回;
}
表单facebook=新表单(新的边界布局(BorderLayout.CENTER\u BEHAVIOR\u CENTER));
getTitleArea().setUIID(“容器”);
按钮连接=新按钮(“使用facebook登录”);
容器c=BoxLayout.encloseY(连接);
添加(BorderLayout.CENTER,c);
connect.addActionListener((evt)->{
/*tokenPrefix=“facebook”;
Login fb=FacebookConnect.getInstance();
fb.setClientId(“XXXXXXXXXXXXXXXXXX”);
fb.setRedirectURI(“http://localhost/callback");
fb.setClientSecret(“xxxxxxxxxxxxxxxxxxxxxxxxxxxx”);
doLogin(fb,新FacebookData(),false)*/
字符串clientId=“XXXXXXXXXXXXXX”;
字符串重定向URI=”http://www.codenameone.com/";
字符串clientSecret=“xxxxxxxxxxxxxxxxxxxxxxxx”;
Login fb=FacebookConnect.getInstance();
fb.setClientId(clientId);
fb.setRedirectURI(redirectURI);
fb.setClientSecret(clientSecret);
Log.p(“已触发登录事件”);
doLogin(fb,新FacebookData(),false);
/*如果(!fb.isUserLoggedIn()){
doLogin(fb,新FacebookData(),false);
}否则{
//获取令牌,现在就可以查询facebook API了
字符串标记=fb.getAccessToken().getToken();
} */
});
facebook.show();
}
void doLogin(登录lg、用户数据数据、布尔forceLogin){
如果(!forceLogin){
if(lg.isUserLoggedIn()){
Log.p(“获取数据……”);
showContactsForm();
返回;
}
String t=Preferences.get(tokenPrefix+“token”,(String)null);
如果(t!=null){
long-tokenExpires=Preferences.get(tokenPrefix+“tokenExpires”,(long)-1);
if(tokenExpires<0 | | tokenExpires>System.currentTimeMillis()){
//我们仍在登录
Log.p(“获取数据……”);
showContactsForm();
返回;
}
}
}
lg.setCallback(新的LoginCallback(){
公共无效登录失败(字符串错误消息){
Log.p(“发生错误”);
show(“登录时出错”,“登录时出错:”+errorMessage,“OK”,null);
}
公共无效登录成功(){
Log.p(“多洛金启动”);
//登录成功后,我们将获取完整数据
data.fetchData(lg.getAccessToken().getToken(),()->{
//我们将结果的值存储到局部变量中
字符串uniqueId=data.getId();
字符串fullName=data.getName();
字符串imageURL=data.getImage();
//然后,我们将数据存储到本地缓存存储中,以便下次运行应用程序时它们会出现
参数设置(“全名”,全名);
参数设置(“uniqueId”,uniqueId);
设置(“imageURL”,imageURL);
set(tokenPrefix+“token”,lg.getAccessToken().getToken());
//令牌过期时间以秒为单位,我们将其转换为System.currentTimeMillis值,以便
//在将来引用它以检查过期情况
set(tokenPrefix+“tokenExpires”,tokenexpireationinmillis(lg.getAccessToken());
showContactsForm();
Log.p(“获取的信息”+全名+“u“+唯一ID+”);
});
}
});
lg.doLogin();
}
long tokenExpirationInMillis(AccessToken令牌){
String expires=token.getExpires();
if(expires!=null&&expires.length()>0){
试一试{
//它将在几秒钟内过期
长l=(长)(Float.parseFloat(expires)*1000);
返回系统.currentTimeMillis()+l;
}捕获(NumberFormatException错误){
//忽略无效输入
}
}
返回-1;
}
静态接口用户数据{
公共字符串getName();
公共字符串getId();
公共字符串getImage();
公共void fetchData(字符串令牌,可运行回调);
//公共联系人数据[]获取联系人();
}
类FacebookData实现UserData{
字符串名;
字符串id;
字符串标记;
@凌驾
公共字符串getName(){
返回名称;
}
@凌驾
公共字符串getId(){
返回id;
}
@凌驾
公共字符串getImage(){
返回“http://graph.facebook.com/v2.8/“+id+”/图片”;
}
@凌驾
公共void fetchData(字符串标记,可运行回调){
this.token=token;
ConnectionRequest req=新的ConnectionRequest(){
@凌驾
受保护的无效读取响应(输入
void doLogin(Login lg, UserData data, boolean forceLogin) {
    if (!forceLogin) {
        if (lg.isUserLoggedIn()) {
            processFacebookLogin(data);
            return;
        }

        // if the user already logged in previously and we have a token
        String token = Preferences.get(tokenPrefix + "token", (String) null);
        if (getToolbar() != null) {
            // we check the expiration of the token which we previously stored as System time
            long tokenExpires = Preferences.get(tokenPrefix + "tokenExpires", (long) -1);
            if (tokenExpires < 0 || tokenExpires > System.currentTimeMillis()) {

                data.fetchData(token, () -> {
                    processFacebookLogin(data);
                });
                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(tokenPrefix + "token", lg.getAccessToken().getToken());
                Preferences.set(tokenPrefix + "tokenExpires", tokenExpirationInMillis(lg.getAccessToken()));
                processFacebookLogin(data);
            });
        }
    });
    lg.doLogin();
}

long tokenExpirationInMillis(AccessToken token) {
    String expires = token.getExpires();
    if (expires != null && expires.length() > 0) {
        try {
            // when it will expire in seconds
            long l = (long) (Float.parseFloat(expires) * 1000);
            return System.currentTimeMillis() + l;
        } catch (NumberFormatException err) {
            // ignore invalid input
        }
    }
    return -1;
}


class FacebookData implements UserData {

    String id;
    String email;
    String name;
    String first_name;
    String last_name;
    String image;
    String link;
    String gender;
    String locale;
    Double timezone;
    String updated_time;
    String verified;

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

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

    @Override
    public String getFullName() {
        return name;
    }

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

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

    @Override
    public String getGender() {
        return gender;
    }

    @Override
    public String getLink() {
        return link;
    }

    @Override
    public String getLocale() {
        return locale;
    }

    @Override
    public Double getTimezone() {
        return timezone;
    }

    @Override
    public String getUpdatedTime() {
        return updated_time;
    }

    @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 {
                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");
                name = (String) parsed.get("name");
                first_name = (String) parsed.get("first_name");
                last_name = (String) parsed.get("last_name");
                link = (String) parsed.get("link");
                gender = (String) parsed.get("gender");
                locale = (String) parsed.get("locale");
                timezone = (Double) parsed.get("timezone");
                updated_time = (String) parsed.get("updated_time;");
                verified = (String) parsed.get("verified");
                image = (String) ((Map) ((Map) parsed.get("picture")).get("data")).get("url").toString();
            }

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

            @Override
            protected void handleErrorResponseCode(int code, String message) {
                //access token not valid anymore
                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.8/me");
        req.addArgumentNoEncoding("access_token", token);
        req.addArgumentNoEncoding("fields", "id,email,name,first_name,last_name,gender,age_range,picture.width(512).height(512),locale,link,timezone,updated_time");
        NetworkManager.getInstance().addToQueue(req);
    }
}