2017-10-11 5 views
2

J'utilise le code suivantnom de code un FB authentification

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(); 
    ... 
} 

Après connexion en compte facebook, il me prend directement au sendRedirectURI (XXX) tel que spécifié dans le code et la fonction de rappel ne fonctionne pas. J'ai besoin de courir setcallback(), comment puis-je y parvenir?

Répondre

1

Vous avez quelques choses à faire pour que Facebook se connecte au travail.

Vous devez définir quel type de données vous souhaitez récupérer. La meilleure façon est de créer une interface UserData et la mettre en œuvre dans votre classe:

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); 
} 

Ensuite, mettre en œuvre comme ceci:

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); 
    } 
} 

Créons une méthode doLogin() qui comprend le 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; 
} 

Enfin, appelez doLogin() après 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);