Введение в API-интерфейсы Facebook

Создание Facebook-приложений для платформы Android Platform при помощи Facebook SDK for Android

Разработчики могут использовать функциональность Facebook в своих приложениях. Если говорить о мобильных устройствах, платформа Facebook поддерживает API для мобильных Web-приложений, а также мобильные SDK для встроенных мобильных приложений, предназначенных для работы на iPhone, iPad и платформе Android. В статье рассматриваются интерфейсы Facebook Platform API и инструментарий Facebook SDK for Android (выпущены группой мобильных приложений Facebook).

16 декабря 2010 – по запросу автора обновлен файл для загрузки и изменено его название на fb-sampleapp.zip (см. раздел Загрузка).

Часто используемые сокращения

  • ADT: Android Development Tools (инструментарий разработки для платформы Android)
  • API: Application Programming Interface (прикладной интерфейс программирования)
  • IDE: Integrated Development Environment (интегрированная среда разработки)
  • JDK: Java Development Kit (комплект инструментальных средств для разработки на языке Java)
  • JSON: JavaScript Object Notation (система обозначений объектов JavaScript)
  • REST: Representational State Transfer (передача репрезентативного состояния)
  • SDK: Software Development Kit (комплект инструментальных средств для разработки программного обеспечения)
  • UI: User Interface (пользовательский интерфейс)
  • URL: Uniform Resource Locator (унифицированный указатель ресурсов)
  • XML: Extensible Markup Language (расширяемый язык разметки)

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

Для работы со статьей необходимы соответствующая квалификация и инструментальные средства:

  • Базовые знания технологии Java™ и навыки использования Eclipse (либо другой IDE).
  • Java Development Kit (версии 5 или 6).
  • Eclipse (версии 3.4 или 3.5).
  • Android SDK и плагин ADT.

Ссылки на файлы для загрузки и информацию по установке приведены в разделе Ресурсы.


Обзор интерфейсов Facebook Platform API

Перед изучением Facebook SDK for Android важно разобраться в платформе Facebook Platform и ее интерфейсах. Согласно Facebook, платформа Facebook Platform позволяет каждому "создавать социальные приложения для Facebook и Web". Для создания таких приложений Facebook предлагает обширный набор основных и расширенных API и SDK (см. раздел Ресурсы).

Основным интерфейсом Facebook Platform является Graph API, позволяющий читать и записывать данные в Facebook. Facebook также имеет так называемый "старый" Old Rest API. Более новый Graph API меняет парадигму API со способа чтения или записи данных в Facebook, ориентированного на использование методов, на новую парадигму, использующую объекты (пользовательские профили, друзья, почтовые сообщения, фотографии, предпочтения и т.д.) и их взаимоотношения или взаимосвязи друг с другом. Такой подход упрощает Facebook API и делает его более целостным. Нужно отметить, что хотя Graph API и является предпочтительным прикладным интерфейсом Facebook API, Old REST API все еще активно используется и поддерживается. Оба интерфейса, Graph API и REST API, применимы к мобильным приложениям, как платформенно-ориентированным (native) так и Web-приложениям, включая мобильный Web-контент во встроенных приложениях, использующих WebViews.

Каждому объекту Graph API назначается уникальный идентификатор (ID), позволяющий легко обращаться к нему по URL, который впоследствии можно уточнить для конкретного объекта/подключения. Общая структура URL объекта: https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE, где OBJECT_ID – уникальный идентификатор объекта, а CONNECTION_TYPE – один из типов подключения, поддерживаемых объектом. Например, страница поддерживает следующие подключения: feed/wall, photos, notes, posts, members и т.д.

Используя Graph API, можно извлекать, удалять и публиковать объекты. Можно выполнять поиск объекта, обновление объекта, фильтрацию результатов поиска и даже динамически обнаруживать подключения и взаимосвязи объекта.

По умолчанию приложения имеют доступ к открытым данным пользователя. Чтобы получить доступ к закрытым данным, приложению нужно сначала запросить у пользователя разрешения, называемые расширенными разрешениями (extended permissions). Facebook определяет большое число разрешений, о которых можно прочитать на странице Extended Permissions (см. раздел Ресурсы).


Введение в Facebook SDK for Android

Теперь, после знакомства с Facebook Platform API, давайте рассмотрим Facebook SDK for Android.

Facebook SDK for Android – это надстройка на языке программирования Java над Facebook Graph API и Old REST API. Этот SDK имеет открытые исходные коды и размещается на github в репозитории facebook / facebook-android-sdk (см. раздел Ресурсы). Отметим, что этот SDK может меняться, так как по своей природе является постоянно развивающимся. Он распространяется на условиях Apache License Version 2.0.

Facebook SDK for Android скрывает большую часть деталей реализации, рассмотренных в предыдущем разделе Обзор Facebook Platform API. Это достигается посредством шести Java-классов, описанных в таблице 1.

Таблица 1. Пакет com.facebook.android
КлассыОписание
AsyncFacebookRunnerВспомогательный класс, реализующий асинхронные вызовы Facebook API.
DialogErrorКласс, инкапсулирующий ошибки диалога.
FacebookГлавный класс Facebook для взаимодействия с Facebook Platform API.
FacebookErrorКласс, инкапсулирующий ошибки Facebook.
FbDialogКласс, реализующий диалоги WebView for Facebook.
UtilВспомогательный класс с несколькими полезными методами.

Facebook SDK for Android также содержит несколько полезных примеров, которые можно использовать как основу для своих собственных приложений.

Особый интерес представляют классы Facebook и Facebook Dialog, которые мы рассмотрим более подробно. Базовый класс Facebook инкапсулирует методы для авторизации пользователя, создания диалогов Facebook, выполнения запросов к API, завершения сеанса работы пользователя, а также получения и настройки доступа и информации о сеансе и его состоянии. Класс Facebook Dialog реализует WebView и методы для его создания, а также логику обработки ответов Facebook URL (состояний). Диалог – это центральное понятие в SDK. SDK предоставляет два метода аутентификации – т.н. единый вход (single-sign on), использующий, если он выбран, встроенные прикладные диалоги Facebook, и подход по умолчанию, базирующийся на WebView. В данной статье я сконцентрируюсь на подходе WebView. Остальные классы SDK и вспомогательные классы инкапсулируют информацию об ошибках или предоставляют полезные функции, используемые в рамках SDK.

В следующих разделах основное внимание уделяется вариантам использования типичного Facebook-приложения:

  • Установка Facebook SDK for Android.
  • Регистрация приложения.
  • Создание SampleApp.
  • Отображение диалогов Facebook.
  • Авторизация пользователя.
  • Выполнение запросов к API.

Установка Android SDK

Необходимо загрузить и установить Eclipse или другую предпочитаемую IDE. Кроме того, необходимо установить Android SDK. Информация по загрузке и установке Eclipse и Android SDK приведена на странице Download the Android SDK Web-сайта Android Developer (см. раздел Ресурсы).


Установка Facebook SDK for Android

Facebook SDK for Android размещен в github в репозитории facebook / facebook-android-sdk. Загрузите исходный код SDK на свой компьютер и разархивируйте его в рабочий каталог. Запустите Eclipse и создайте проект Android Project, выбрав File Menu -> New -> Project и Android Project. Создайте проект из существующего исходного кода и укажите каталог, в который разархивировали загруженные файлы (ссылка на исходный код приведена в разделе Загрузка).


Регистрация приложения

Перед началом работы необходимо зарегистрировать Facebook-приложение, а также получить идентификатор приложения (client_id) и ассоциированный с ним секретный ключ (client_secret). Идентификатор client_id используется в приложении при выполнении различных обращений к Facebook API.


Пример приложения

Мой пример приложения, который я назвал SampleApp, демонстрирует использование Facebook SDK for Android. Приложение состоит из одного файла, реализующего работу SampleApp и использующего один экран для отображения сообщений, списка друзей Facebook и элементов меню для регистрации/аутентификации пользователя, получения списка друзей и для отправки сообщения на стену (wall) аутентифицированного пользователя (me).

Помните, что до начала работы необходимо зарегистрировать приложение на Facebook (как рассматривалось ранее) и установить для атрибута APP_ID в SampleApp.java значение client_id, предоставленное Facebook (см. листинг 1).

Листинг 1. Инициализация идентификатора приложения
// Установка идентификатора приложения в полученное значение client_id
// См. http://www.facebook.com/developers/createapp.php
public static final String APP_ID = ".....";

В нашем примере приложения используется линейная схема экрана, содержащая TextView для сообщений о состоянии, ListView для отображения списка друзей Facebook, извлеченного с сервера, и элементы меню: регистрация/авторизация пользователя, получение списка друзей, отправка сообщения на стену аутентифицированного пользователя. В листинге 2 приведены объявления пользовательского интерфейса на языке XML для схемы главного экрана пользовательского интерфейса.

Листинг 2. Объявления пользовательского интерфейса для главного экрана
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/black"
    >
    
    <TextView android:id="@+id/txt"     
        android:text="@string/hello"
        android:textColor="@drawable/white"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingRight="10dp" 
        android:paddingLeft="10dp"
        android:layout_margin="10dp"
        android:textSize="10sp" 
        android:layout_marginTop="5px" 
        android:layout_marginBottom="5px"
        android:layout_marginRight="0px" 
        android:layout_marginLeft="0px"
        android:gravity="left"
    />
    
    <ListView  
        android:id="@+id/friendsview"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:textFilterEnabled="true" 
    />
    <TextView 
        android:id="@id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="No data"
     />               
</LinearLayout>

В листинге 3 приведены объявления пользовательского интерфейса на XML для каждой строки в ListView.

Листинг 3. Объявления пользовательского интерфейса строки ListView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="10dip"
    >
     <TextView
         android:id="@+id/rowtext_top"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:gravity="center_vertical"
     />
</LinearLayout>

В листинге 4 приведены объявления пользовательского интерфейса на XML для элементов меню.

Листинг 4. Объявления пользовательского интерфейса элементов меню
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/login" android:title="Login"/>
    <item android:id="@+id/getfriends" android:title="Get Friends"/>
    <item android:id="@+id/wallpost" android:title="Wall Post" />
</menu>

На рисунке 1 показаны результаты этих объявлений пользовательского интерфейса для SampleApp до (с кнопкой Login) и после (с кнопками Logout, Get Friends и Wall Post) входа в систему.

Рисунок 1. Схема экрана SampleApp
Рисунок 1. Схема экрана SampleApp

При создании экземпляра SampleApp платформа Android активизирует метод SampleApp onCreate(). Этот метод предварительно проверяет, установлен ли App ID, инициализирует ресурсы пользовательского интерфейса и экземпляр Facebook-сеанса (см. листинг 5).

Листинг 5. Инициализация приложения
/** Вызывается при первой активности. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Проверка установки client_app.
    if (APP_ID == null) {
        Util.showAlert(this, 
        "Warning", "Facebook Application ID must be set...");
    }

    // Инициализация представления содержимого.
    setContentView(R.layout.main);
    // Get the status text line resource
    mText = (TextView) SampleApp.this.findViewById(R.id.txt);

    // Установка ListView Adapter, загружаемого при выборе get friends.
    listView = (ListView) findViewById(R.id.friendsview);
    friendsArrayAdapter = new FriendsArrayAdapter(this, R.layout.rowlayout, friends);
    listView.setAdapter(friendsArrayAdapter);

    // Определение вращающего объекта (spinner), использующегося
	// при загрузке списка пользователей по сети.
    mSpinner = new ProgressDialog(listView.getContext());
    mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE);
    mSpinner.setMessage("Loading...");

    // Инициализация сеанса работы Facebook.
    mFacebook = new Facebook(APP_ID);
    mAsyncRunner = new AsyncFacebookRunner(mFacebook);

}

Остальная логика работы приложения активизируется при взаимодействиях с пользовательским интерфейсом посредством элементов меню. Определены три элемента меню: 1) login/logout (вход/выход, переключаемый), 2) get friends (получение списка друзей) и 3) post to the wall (публикация на стене) (см. листинг 4). При выборе элемента меню приложение выполняет соответствующее действие. В листинге 6 показано, как обрабатываются элементы меню. Он демонстрирует создание экземпляра меню путем конкретизации его XML-определения.

Листинг 6. Создание меню
/**
 * Активизируется во время создания меню 
 * @param – создаваемое меню
 */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

В листинге 7 демонстрируется изменение элементов меню перед отображением, т.е. вывод кнопок login или logout, а также включение/выключение опций извлечения списка друзей и публикации на стене.

Листинг 7. Создание меню
/**
 * Активизируется при подготовке отображения меню
 * @param menu – подготавливаемое меню
 */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem loginItem = menu.findItem(R.id.login);
    MenuItem postItem = menu.findItem(R.id.wallpost);
    MenuItem getfriendsItem = menu.findItem(R.id.getfriends);
    if (mFacebook.isSessionValid()) {
        loginItem.setTitle("Logout");
        postItem.setEnabled(true);
        getfriendsItem.setEnabled(true);
    } else {
        loginItem.setTitle("Login");
        postItem.setEnabled(false);
        getfriendsItem.setEnabled(false);
    }
    loginItem.setEnabled(true);
    return super.onPrepareOptionsMenu(menu);
}

В листинге 8 показано, как обрабатываются элементы меню и активизируется соответствующее действие (login/logout, get friends, post to wall).

Листинг 8. Обработка действия, выбранного в меню
/**
 * Активизируется при выборе элемента меню
 * @param item – выбранный элемент меню
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        // Переключение login/logout.
        case R.id.login:
            // Переключение состояния кнопки. 
            //  После login перейти в logout.
            if (mFacebook.isSessionValid()) {
                AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(mFacebook);
                asyncRunner.logout(this.getBaseContext(), new LogoutRequestListener());
            } else {
                // Переключение состояния кнопки.
                // После logout переключить в login (авторизация).
                mFacebook.authorize(this, PERMISSIONS, new LoginDialogListener());
            }
            break;

        // Сообщение на стене.
        case R.id.wallpost: // Wall Post
            mFacebook.dialog(SampleApp.this, "stream.publish", new 
                                                  WallPostDialogListener());
            break;

        // Получить список друзей.
        case R.id.getfriends: // Wall Post
            // Получить список друзей аутентифицированного пользователя.
            mSpinner.show();
            mAsyncRunner.request("me/friends", new FriendsRequestListener());
            break;

        default:
            return false;

    }
    return true;
}

Для обработки состояния каждого асинхронного вызова в приложении используется несколько функций обратного вызова (callback). В SampleApp определены функции обратного вызова для обработки успешных или неудачных запросов на вход в систему, для диалогов выхода из системы, для диалогов отправки сообщения на стену, для запросов о друзьях. Вы можете добавить свои собственные действия, следуя тому же шаблону добавления меню и соответствующих вызовов Facebook с соответствующими функциями обратного вызова для получения сообщений о состоянии.

Оба элемента меню, login и post to wall, активизируют диалоги Facebook, которые по умолчанию используют WebView-диалоги SDK, если не выбрана опция единого входа; этот вопрос рассматривается в следующем разделе.

Функция обратного вызова FriendsRequestListener описывается в разделе Выполнение запросов Facebook API. Последняя функция обратного вызова MyDialogListener реализует Facebook SDK for Android DialogListener для запросов Facebook, которые используют WebView-диалоги SDK, как описано в следующем разделе. Конструктор DialogListener должен реализовывать соответствующую логику завершения, например, во время запросов login и wall post.


Отображение диалогов Facebook

Facebook SDK for Android основан на Facebook-диалогах Web/сервер, обеспечивающих различные взаимодействия с пользователями, такие как авторизация, установка разрешений и публикация сообщений. Базовый класс SDK Facebook.java определяет метод dialog() при генерировании диалога пользовательского интерфейса для запрашиваемого действия (см. листинг 9).

Листинг 9. Метод Facebook Dialog
/**
 * Генерирование UI-диалога для запрашиваемого действия в конкретном 
 * Android-контексте с использованием предоставленных параметров.
 */
public void dialog(
        Context context, 
        String action, 
        Bundle parameters,
        final DialogListener listener) {
    :
    :
}

Этот асинхронный метод принимает в качестве входных данных контекст приложения, выполняемое действие (например, login, publish_stream, read_stream, offline_access), необходимые для конкретного запроса или действия параметры и метод listener, вызываемый при завершении выполнения асинхронных методов. Метод создает соответствующий WebView-диалог. Например, для публикации сообщения о состоянии выполняется вызов метода dialog() базового класса Facebook, в который передается действие stream.publish (см. листинг 10).

Листинг 10. Вызов метода dialog() и обработка функции обратного вызова
package com.myapp.facebook.android;
:

import com.facebook.android.*;
:

mFacebook = new Facebook(); // Facebook core
:

// Создать Facebook-диалог (используя вызов асинхронного API).
mFacebook.dialog(
    this,
    "stream.publish", 
    new MyDialogListener());   

:
:

//
// Асинхронный прослушиватель диалога.
//
public class MyDialogListener extends com.facebook.android.Facebook.DialogListener {

    public void onComplete(Bundle values) {

        final String postId = values.getString("post_id");

        if (postId != null) {

            // "Wall post made..."

        } else {
            // "No wall post made..."
        }

    }

    public void onFacebookError(FacebookError e) {...}
    public void onError(DialogError e) {...}
    public void onCancel() {...}

}

Результатом этого вызова является Web-диалог publish to wall, показанный на рисунке 2.

Рисунок 2. Размещение сообщения на стене
Рисунок 2. Размещение сообщения на стенке

Это знакомая Web-страница Facebook для размещения сообщения на стене пользователя. Пользователь может пропустить это окно или продолжить действие и опубликовать сообщение. Такое совместное использование встроенного и Web-содержимого в одном мобильном приложении является отличным примером возможностей гибридных приложений.


Авторизация пользователей

Платформа Facebook Platform предоставляет поддержку аутентификации OAuth 2.0, а также более старой сигнатурной схемы авторизации. При написании новых приложений следует избегать применения старой схемы аутентификации, поскольку в ближайшем будущем поддержка этой схемы прекратится. В разделе Ресурсы приведена ссылка на спецификацию OAuth 2.0 Protocol.

Facebook SDK for Android вместе с Facebook Platform скрывают сложность OAuth-аутентификации (см. рисунок 3).

Рисунок 3. Протокол OAuth 2.0 (IETF)
Рисунок 3. Протокол OAuth 2.0 (IETF)

Facebook SDK for Android использует для аутентификации мобильный Web-метод, а не встроенный. Отметим, что будущие версии SDK, возможно, будут иметь встроенную поддержку OAuth. При таком подходе SDK использует для аутентификации Web-диалог Facebook внутри WebView. Такой подход интересен по нескольким причинам:

  • Уменьшается сложность реализации OAuth, встроенной в приложение.
  • Возможно, пользователи больше доверяют стандартным и знакомым диалогам входа и запроса разрешения, отображаемым в обычных браузерах при использовании Facebook.

Недостатком этого подхода является то, что иногда он может оказаться более медленным, чем встроенная реализация. В связи с этим в SDK также предлагается альтернативный подход к аутентификации/входу, использующий встроенные в Facebook средства единого входа. Если на устройстве установлено официальное Facebook-приложение, Facebook SDK for Android может использовать его алгоритм авторизации/входа. Но для этого необходимо сначала подписать ваше приложение (см. статью Фрэнка Эйблсона "Введение в систему защиты Android", ссылка на которую приведена в разделе Ресурсы), а затем сгенерировать подпись или хеш-ключ (см. листинг 11).

Листинг 11. Генерирование хеш-ключа приложения
keytool -exportcert -alias [alias] -keystore [keystore] | openssl sha1 -binary | 
                                                                          openssl base64

Отметим, что код из листинга 11 обычно располагается в одной строке. Здесь он разделен на несколько строк в целях форматирования.

Затем нужно зарегистрировать сгенерированный хеш-ключ для вашего конкретного приложения на Facebook в разделе Mobile and devices, как показано на рисунке 4. (Увеличенная версия рисунка 4.)

Рисунок 4. Ввод хеш-ключа приложения
Рисунок 4. Ввод хеш-ключа приложения

После регистрации необходимо определить обработчик результата действия для приложения – реализовать onActivityResult(...), в котором активизировать метод facebook.authorizeCallback(...), как показано в листинге 12.

Листинг 12. Определение обработчика результата действия
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  facebook.authorizeCallback(requestCode, resultCode, data);
  :
  :
  // ... Другие действия onActivityResult в приложении...
}

Отметим, что если метод единого входа не определен или отсутствует встроенное Facebook-приложение, SDK по умолчанию будет выбирать WebView-подход для аутентификации/входа. В оставшейся части статьи применяется подход по умолчанию.

Как уже говорилось, по умолчанию приложение имеет доступ к открытым данным в профиле пользователя. Для доступа к закрытым данным приложение должно запросить разрешения, а пользователь – предоставить их. Разрешения на получение доступа к закрытым данным называются Extended Permissions.

Метод authorize() платформы Facebook SDK for Android реализует алгоритм OAuth 2.0 User-Agent для извлечения маркера доступа, используемого в последующих запросах API. Метод запускает либо действие (Activity) (встроенное Facebook-приложение, если оно присутствует и настроено), либо WebView-диалог, запрашивающий у пользователя его полномочия (аутентификация) и разрешения (авторизация) (см. листинг 13).

Листинг 13. Метод authorize
/**
 * Метод authorize, предоставляющий пользовательские разрешения.
 */
public void authorize(Activity activity, String[] permissions,
        final DialogListener listener) {
    :
    :
}

Отметим, что для корректной работы аутентификации посредством единого входа необходимо в функцию onActivityResult() включить вызов метода authorizeCallback().

Вспомните, как элемент меню login в листинге 8 активировал метод authorize() с разрешениями.

Листинг 14 демонстрирует, как активизировать метод authorize() с разрешениями на запись содержимого. Он также имеет разрешение на запись комментариев и предпочтений (publish_stream), чтение пользовательских фидов (feed), выполнение поиска (read_stream) и продление полномочий доступа (offline_access). Не забудьте установить свой APP_ID.

Листинг 14. Вызов метода authorize() с разрешениями
package com.myapp.facebook.android;
:
import com.facebook.android.*;
:

public static final String APP_ID = "13234...";

private static final String[] PERMISSIONS = new String[] {"publish_stream", 
        "read_stream", "offline_access"};

:
:

// Вызов метода авторизации.
mFacebook.authorize(
    getContext(), 
    APP_ID, 
    mPermissions,
    new MyLoginDialogListener());

:
:

// Асинхронный обратный вызов после завершения авторизации.
private final class MyLoginDialogListener implements com.facebook.android
          .Facebook.DialogListener {

    public void onComplete(Bundle values) {...} // разрешить logout
    public void onFacebookError(FacebookError error) {...}
    public void onError(DialogError error) {...}
    public void onCancel() {...}
}

Метод authorize() активизирует рассмотренный ранее метод dialog(), но на этот раз в качестве действия передается запрос Login. При помощи Facebook Platform и ее реализации спецификации OAuth метод authorize() обеспечивает запрос аутентификации в Facebook и возврат маркера access_token, использующегося в сеансе Facebook и при обращении к API: https://graph.facebook.com/ID?access_token=....

Подробная информация о том, как работает аутентификация, размещена на странице Facebook Authentication, ссылка на которую приведена в разделе Ресурсы.

Вызов метода authorize() приводит к отображению WebView-диалогов, показанных на рисунке 5.

Рисунок 5. Экраны авторизации и разрешений (WebView)
Рисунок 5. Экраны авторизации и разрешений (WebView)

После входа пользователя в систему приложение запрашивает разрешения на доступ к определенным данным (информация об адресе электронной почты или телефоне и пароль). Пользователь может разрешить или запретить приложению доступ к своей Facebook-странице, а также доступ к базовой информации, возможность публикации на стене пользователя, доступ к сообщениям в новостных фидах, доступ к данным о пользователе.


Выполнение запросов Facebook API

Базовый класс Facebook реализует несколько методов request() для вызовов Old REST и Graph API. Кроме того, SDK предоставляет вспомогательные классы для выполнения асинхронных вызовов API.

В качестве примера вызова API мы выполним запрос извлечения списка друзей аутентифицированного пользователя. Вспомните структуру Graph API:

https://graph.facebook.com/ID/CONNECTION_TYPE

Снова обратите внимание на специальный идентификатор me, который используется для идентификации аутентифицированного пользователя; пользователь вошел в https://graph.facebook.com/me/friends.

В листинге 15 приведен фрагмент кода из листинга 8, в котором показан вызов метода request(). В этом примере используется метод AsyncFacebookRunner.request(...), который является вспомогательной оболочкой, позволяющей вызывать используемый метод асинхронно путем выполнения его в своем собственном потоке. Это действие выполняется, чтобы избежать блокировки главного потока пользовательского интерфейса.

Листинг 15. Асинхронная диспетчеризация метода
// Получить список друзей
case R.id.getfriends: // Wall Post
    // Получить список друзей аутентифицированного пользователя
    mSpinner.show();
    mAsyncRunner.request("me/friends", new FriendsRequestListener());
    break;

Функция обратного вызова FriendsRequestListener onComplete(...) активизируется, когда завершается выполнение запроса на получение списка друзей. Этот метод анализирует возвращаемый JSON со списком друзей. Отметим, что в листинге 16 не показаны все реализованные методы.

Листинг 16. Обработка запроса на получение списка друзей
/**
 * FriendsRequestListener реализует прослушивателя запроса/функцию обратного
 * вызова для запросов get friends.
 */
public class FriendsRequestListener implements 
        com.facebook.android.AsyncFacebookRunner.RequestListener {

    /**
     * Вызывается после завершения запроса на получение списка друзей.
     * Извлечение, анализ и отображение потока JSON.
     */
    public void onComplete(final String response) {
        mSpinner.dismiss();
        try {
            // обработка ответа: выполняется в фоновом потоке
            Log.d("Facebook-Example-Friends Request", "response.length(): " + 
                                                                response.length());
            Log.d("Facebook-Example-Friends Request", "Response: " + response);

            final JSONObject json = new JSONObject(response);
            JSONArray d = json.getJSONArray("data");
            int l = (d != null ? d.length() : 0);
            Log.d("Facebook-Example-Friends Request", "d.length(): " + l);

            for (int i=0; i<l; i++) {
                JSONObject o = d.getJSONObject(i);
                String n = o.getString("name");
                String id = o.getString("id");
                Friend f = new Friend();
                f.id = id;
                f.name = n;
                friends.add(f);
            }

            // Только владелец потока может обратиться к своим представлениям.
            SampleApp.this.runOnUiThread(new Runnable() {
                public void run() {
                    friendsArrayAdapter = new FriendsArrayAdapter(
                            SampleApp.this, R.layout.rowlayout, friends);
                    listView.setAdapter(friendsArrayAdapter);
                    friendsArrayAdapter.notifyDataSetChanged();
                }
            });
        } catch (JSONException e) {
            Log.w("Facebook-Example", "JSON Error in response");
        }
    }

    :
    :
}

Исходя из требований к конкретному приложению ответ сервера Facebook, представленный в формате JSON, необходимо проанализировать и обработать соответствующим образом. Можно также отобразить эту информацию, используя WebView или ListView, как в нашем примере SampleApp (см. рисунок 6).

Рисунок 6. Отображение результатов
Рисунок 6. Отображение результатов

Заключение

В данной статье были рассмотрены интерфейсы Facebook API. Был дан общий обзор платформы Facebook Platform и ее API, а затем были рассмотрены Facebook SDK for Android и пример приложения. Эта информация поможет лучше понять различные интерфейсы Facebook API и приступить к созданию Facebook-приложений для платформы Android.


Загрузка

ОписаниеИмяРазмер
Исходный код к статьеfb_sampleapp.zip12 КБ

Ресурсы

Научиться

Получить продукты и технологии

  • Facebook SDK for Android (в настоящее время альфа-версия): поработайте с этой библиотекой и интегрируйте Facebook в свои мобильные Android-приложения.
  • Платформа Facebook Platform: расширьте свои возможности по созданию социальных приложений на Facebook и в Web.
  • Facebook Old REST API (предыдущая версия Graph API): программное взаимодействие с Web-сайтом Facebook посредством простых HTTP-запросов.
  • Facebook Graph API (текущая версия): подробная информация о базовом интерфейсе Facebook Platform API.
  • Спецификация OAuth 2.0 Protocol (июль 2010 года): информация об OAuth-аутентификации, поддерживаемой платформой Facebook Platform.
  • Android SDK: файлы для загрузки SDK, справочная информация по API, последние новости по платформе Android на официальном сайте для разработчиков Android-приложений. Для примеров статьи подойдет версия 1.5 или выше.
  • Проект Android Open Source Project: информация и открытый исходный код для проектирования совместимых с Android устройств.
  • JDK 6 Update 21: платформа Java Platform, Standard Edition.
  • Eclipse: последняя версия Eclipse IDE.
  • Facebook SDK for Android: ссылка на текущую версию (на момент публикации - альфа-версию) Facebook SDK for Android.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, Open source
ArticleID=808547
ArticleTitle=Введение в API-интерфейсы Facebook
publish-date=04052012