FacebookConnect Codename one api

问题描述:

我试图从Facebook获取数据,在执行时应用程序可以从Facebook获取数据,但是当我试图将Facebook配置文件图片动态设置为用户图片时,它会引发错误,我不会“知道什么是错我的代码.. 下面是我的代码FacebookConnect Codename one api

 Form facebook = new Form("Facebook", new BoxLayout(BoxLayout.Y_AXIS)); 
     Toolbar tb = new Toolbar(); 
     facebook.setToolbar(tb); 

     user = theme.getImage("user.png"); 
     Label userLabel = new Label(user); 
     username = new Label("Visitor"); 
     Button login = new Button("Login"); 

     login.addActionListener((evt) -> { 
      String clientId = "158093724691158"; 
      String redirectURI = "http://www.codenameone.com/"; 
      String clientSecret = "eca942518c753053dd0adeff93ad78c3"; 
      fb = FacebookConnect.getInstance(); 
      fb.setClientId(clientId); 
      fb.setRedirectURI(redirectURI); 
      fb.setClientSecret(clientSecret); 
      Log.p("login event triggered"); 
      doLogin(fb, new FacebookData(), false); 
     }); 

     facebook.show(); 

    } 

    void processFacebookLogin(UserData data){ 
     Log.p("First NAme : " + data.getFirstName()); 
       Log.p("Last Name : " + data.getLastName()); 
     Log.p("Email : " + data.getEmail()); 
     Log.p("Full Name : " + data.getFullName()); 
      Log.p("Gender : " + data.getGender()); 
      Log.p("Id : " + data.getId()); 
      Log.p("Link : " +data.getLink()); 
      Log.p("Locale : " +data.getLocale()); 
      Log.p("Time-Zone : " +data.getTimezone()); 
      Log.p("Pcture : " +data.getImage()); 
      Log.p("Updated Time : " + data.getUpdatedTime()); 
      Log.p("Story" + data.getStory()); 
      username.setText(data.getFullName()); 
    user = (EncodedImage) Image. createImage(data. getImage()) ; //here i am trying to set facebook user profile picture 

      } 

    void doLogin(Login lg, UserData data, boolean forceLogin) { 
    if (!forceLogin) { 
     if (lg.isUserLoggedIn()) { 
      processFacebookLogin(data); 
      new FacebookData(); 
      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; 
} 

static interface UserData{ 
    public String getId(); 
    public String getEmail(); 
     public String getFullName(); 
     public String getFirstName(); 
     public String getLastName(); 
     public String getGender(); 
      public String getLink(); 
      public String getLocale(); 
      public Double getTimezone(); 
      public String getUpdatedTime(); 
      public String getImage(); 
      public String getStory(); 
       public void fetchData(String token, Runnable callback); 
    } 


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; 
    String story; 

    @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 String getStory() { 
     return story; 
    } 

    @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(); 
       story = (String) ((Map) ((Map)parsed.get("posts")).get("data")).get("story").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); //this statement is used to patch access token with url 
     req.addArgumentNoEncoding("fields", "id,email,name,first_name,last_name,gender,age_range,picture.width(512).height(512),locale,link,timezone,updated_time,posts.limit(10)"); 
     //above statement is used to provide permission through url so server send data with respect ot permissions. 
     NetworkManager.getInstance().addToQueue(req); 
    } 
} 

    public void stop() { 
     current = Display.getInstance().getCurrent(); 
     if(current instanceof Dialog) { 
      ((Dialog)current).dispose(); 
      current = Display.getInstance().getCurrent(); 
     } 
    } 

    public void destroy() { 
    } 

} 
+1

请,发布错误和降低代码到被产生它的一部分。包含很多不相关的代码。发布您如何连接到Facebook(删除您的ID)以及如何设置个人资料图片。 – RubioRic

+0

我也建议查看Facebook演示,它也提取配置文件映像 –

你将不得不使用URLImage来解决:

改变这一行:

user = (EncodedImage) Image. createImage(data. getImage()) ; 

要:

if (data.getImage() != null) { 
    EncodedImage encImage = EncodedImage.createFromImage(user.getIcon(), true); 
    Display.getInstance().callSerially(() -> { 
     user.setIcon(URLImage.createToStorage(encImage, data.getImage(), data.getImage(), null)); 
     user.getComponentForm().repaint(); 
    }); 
}