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()
.
User
: справка о пользователе в API GraphGraphRequestBatch
: справка о классе GraphRequestBatch
GraphRequest
: справка о классе GraphRequest