Codenameone 代号one FacebookConnect
我目前正在尝试代号为1的跨平台移动应用程序开发,该应用程序需要社交登录。我试图介绍facebook登录,但它不起作用。我可能做错了什么 下面是我遇到错误的代码: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
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);
}
}