Использование API Graph для Android

Android SDK поддерживает интеграцию с Facebook API Graph. Классы GraphRequest и GraphResponse позволяют отправлять запросы и получать ответы в формате JSON в асинхронном режиме. Кроме того, класс GraphRequestBatch позволяет отправлять серверам Facebook пакетные запросы, которые обрабатываются за один цикл.

Подробнее об API Graph см. в разделах:

См. также справочные материалы по GraphRequest, GraphResponse и GraphRequestBatch. Вы узнаете, как использовать Facebook SDK для Android и создавать вызовы API Graph для дополнительных сценариев.

Предварительные требования

Сначала настройте:

Класс GraphRequest

В классе GraphRequest есть метод newMeRequest. Он вызывает эндпойнт /user/me, чтобы извлечь данные пользователя для указанного маркера доступа.

Android SDK отправляет все разрешения, указанные в access_token, тем самым обеспечивая контроль доступа к данным. Если у приложения нет маркера доступа, API Graph возвращает только общедоступную информацию. Подробнее о свойствах и разрешениях User см. в разделе Справка по API Graph: User.

По умолчанию метод newMeRequest извлекает из объекта пользователя поля, заданные по умолчанию. Если вам нужны дополнительные поля или в целях повышения производительности нужно сократить полезную нагрузку ответа, добавьте параметр fields и запросите требуемые поля:

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

В методе обратного вызова данные ответа десериализуются в JSONObject, если запрос выполнен успешно. Поля, которые невозможно извлечь из-за отсутствия необходимых разрешений, будут исключены из результата.

Для пользователя, который выполнил вход, в SDK есть классы Profile и ProfileTracker. См. раздел Вход через Facebook для Android.

Доступ к данным пользователя

Доступ к данным зависит от того, какие разрешения предоставлены приложению и какие данные доступны приложениям. Вот пример необработанного отклика API Graph для user_location и 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
}

Обработка результатов

В зависимости от эндпойнта вызова вы получите JSONObject или JSONArray.

При вызовах одиночного объекта, например newMeRequest, возвращается JSONObject. Вызовы для получения списка результатов, например newMyFriendsRequest, возвращают JSONArray.

Обработка ошибок

Вы можете изучить поле ошибок в объекте GraphResponse, чтобы понять, удалось ли выполнить запрос. Поле ошибок относится к типу FacebookRequestError. Вы можете вызвать следующие методы:

В объекте ошибки есть поля, в которых приведена подробная информация об ошибке, в том числе:

  • error code
  • sub error code
  • error message
  • user facing error message
  • и прочая информация.

Подробнее о возможных кодах ошибки см. в разделе Использование API Graph, Обработка ошибок.

Объект GraphResponse также содержит элемент enum, который присваивает категорию ошибкам. Есть три категории ошибок:

  • LOGIN_RECOVERABLE: проблема, при которой пользователь должен снова выполнить вход. Вы можете вызвать из LoginManager метод resolveError с объектом GraphResponse, а также действие или фрагмент из приложения. При этом будет запущен пользовательский интерфейс входа через Facebook, и вам нужно будет вызвать фрагмент или действие, чтобы реализовать CallbackManager и успешно войти.
  • TRANSIENT: временная проблема, при которой приложение может повторить запрос.
  • OTHER: проблема общего характера. Подробная информация доступна в полях error code и sub error code.

Устранение неполадок

Если проблема связана с извлечением данных пользователя, активируйте регистрацию HTTP-запросов. Для этого нужно добавить код перед разделом, в котором приложение запрашивает данные пользователя:

FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);

Это позволит зарегистрировать информацию о запросах и ответах HTTP в журнале консоли.

Пакетные запросы

Вы можете использовать пакетные запросы данных, если приложение обрабатывает следующие типы сценариев:

  • Доступ к значительным объемам данных в одном запросе или
  • Одновременное изменение нескольких объектов.

Пакетные запросы позволяют сократить число циклов запроса и ответа для сервера. Например, мы хотим извлечь данные о пользователе и его друзьях:

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

В примере выше показан пакетный запрос в виде асинхронного вызова. Если этот код выполняется в фоновом потоке и вы хотите установить блокировку до завершения вызова, можете вызвать метод batch.executeAndWait().

Дополнительные ресурсы