Como usar a API de Gráfico - Android

O SDK do Android é compatível com a integração com a API de Gráfico do Facebook. Com as classes GraphRequest e GraphResponse, você pode fazer solicitações e obter respostas em JSON de forma assíncrona. Também é possível fazer solicitações em lote com uma única ida e volta aos servidores do Facebook com GraphRequestBatch.

Saiba mais sobre a API de Gráfico em:

Veja também as referências GraphRequest, GraphResponse e GraphRequestBatch para saber como usar o SDK do Facebook para Android e como fazer chamadas da API de Gráfico para casos de uso adicionais.

Pré-requisitos

Antes de começar, configure:

Classe GraphRequest

A classe GraphRequest tem um método newMeRequest, que chama o endpoint /usuário/eu para buscar dados do usuário para o token de acesso específico.

O SDK do Android envia permissões que o aplicativo tem no access_token, e isso controla o acesso aos dados. Se o aplicativo não tiver um token de acesso disponível, a API de Gráfico retornará apenas as informações publicamente disponíveis. Para obter detalhes sobre as propriedades e as permissões do User, confira Referência da API de Gráfico, User.

Por padrão, um método do newMeRequest busca campos padrão de um objeto de usuário. Se você precisar de algum campo adicional ou quiser reduzir a carga de resposta por motivos de desempenho, adicione um parâmetro fields e solicite campos específicos:

GraphRequest request = GraphRequest.newMeRequest(
        accessToken,
        new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(
                   JSONObject object,
                   GraphResponse response) {
                // Application code
            }
        });
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link");
request.setParameters(parameters);
request.executeAsync();

No método de retorno de chamada, os dados de resposta são desserializados em um JSONObject se a solicitação for bem-sucedida. Serão omitidos do resultado os campos que não puderem ser buscados devido à falta de permissões.

Para o usuário logado, o SDK tem as classes Profile e ProfileTracker, confira Login no Facebook para Android.

Buscar dados de usuário

Os dados que você acessar dependem das permissões que alguém concede ao aplicativo e dos dados que eles escolheram compartilhar com aplicativos. Aqui está um exemplo de resposta bruta da API de Gráfico para user_location e user_birthday:

{
  "id": "12345678", 
  "birthday": "1/1/1950", 
  "first_name": "Chris", 
  "gender": "male", 
  "last_name": "Colm", 
  "link": "http://www.facebook.com/12345678", 
  "location": {
    "id": "110843418940484", 
    "name": "Seattle, Washington"
  }, 
  "locale": "en_US", 
  "name": "Chris Colm", 
  "timezone": -8, 
  "updated_time": "2010-01-01T16:40:43+0000", 
  "verified": true
}

Como lidar com resultados

Dependendo do endpoint chamado, você receberá um JSONObject ou JSONArray.

Chamadas de objeto único, como newMeRequest, retornam um JSONObject. Chamadas de vários resultados, como newMyFriendsRequest, retornam um JSONArray.

Como lidar com erros

Você pode examinar o campo de erro em um objeto GraphResponse para ver se uma solicitação falha ou não. O campo de erro é do tipo FacebookRequestError. Os métodos que você pode chamar são:

O objeto de erro tem campos que explicam detalhes sobre o erro, incluindo:

  • error code,
  • sub error code
  • error message
  • user facing error message
  • E outras mensagens.

Para mais detalhes sobre possíveis códigos de erro, confira Como usar a API de Gráfico, Como lidar com erros.

O objeto GraphResponse também tem um enum que categoriza o erro. As três categorizações possíveis são:

  • LOGIN_RECOVERABLE - Há um problema exigindo que o usuário faça login novamente. Você chama o LoginManager do resolveError com o objeto GraphResponse e a atividade ou o fragmento do aplicativo do seu aplicativo. Isso abre a interface do usuário de Login no Facebook, e você precisa implementar um CallbackManager chamando o fragmento ou a atividade para o login ser realizado.
  • TRANSIENT - Indica que ocorreu um problema temporário, e seu aplicativo pode repetir a solicitação.
  • OTHER - Indica que ocorreu um problema geral, e que você pode obter mais detalhes verificando o error code e o sub error code.

Solução de problemas

Se você tiver problemas para buscar dados de usuário, ative o registro em log de solicitação HTTP adicionando este código antes de o aplicativo solicitar dados de usuário:

FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);

Isso registrará os detalhes sobre as solicitações HTTP e a resposta ao registro do console.

Solicitações em lote

Você deverá fazer solicitações em lote para dados se o aplicativo lidar com os seguintes tipos de situações:

  • Acesso de quantidades significativas de dados em uma única solicitação ou
  • Alterações em vários objetos de uma vez.

Se você quiser reduzir a quantidade de idas e voltas ao servidor, use uma solicitação em lote. Por exemplo, podemos buscar um usuário e seus amigos:

GraphRequestBatch batch = new GraphRequestBatch(
        GraphRequest.newMeRequest(
                access_token,
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject jsonObject,
                            GraphResponse response) {
                        // Application code for user
                    }
                }),
        GraphRequest.newMyFriendsRequest(
                access_token,
                new GraphRequest.GraphJSONArrayCallback() {
                    @Override
                    public void onCompleted(
                            JSONArray jsonArray, 
                            GraphResponse response) {
                        // Application code for users friends 
                    }
                })
);
batch.addCallback(new GraphRequestBatch.Callback() {
    @Override
    public void onBatchCompleted(GraphRequestBatch graphRequests) {
        // Application code for when the batch finishes
    }
});
batch.executeAsync();

O exemplo acima mostra a solicitação em lote como uma chamada assíncrona. Se este código estiver em um segmento de segundo plano e você quiser bloquear até a conclusão da chamada, pode chamar batch.executeAndWait().

Recursos relacionados