Facebook API 入門

Facebook SDK for Android を使用して Android プラットフォーム用の Facebook アプリケーションを作成する

皆さんのアプリケーションに Facebook の機能を組み込むことができます。モバイルの観点から見ると、Facebook Platform はモバイル Web アプリケーション用の API をサポートしており、また iPhone、iPad、および Android プラットフォームにネイティブなモバイル・アプリケーション用のモバイル SDK もサポートしています。この記事では、Facebook Platform API と Facebook SDK for Android (Facebook のモバイル・チームがリリースした SDK) について説明します。

C. Enrique Ortiz, Developer and author, About Mobility Weblog

C. Enrique Ortiz はモバイルの技術者、開発者、著作者として長年活躍しています。彼は「About Mobility」というブログを書いており、また MobileMonday の Austin 支部の設立者でもあります。



2010年 12月 16日 (初版 2010年 12月 14日)

2010年 12月 16日 - 著者の要請により、ダウンロード・ファイルを更新し、ファイル名を fb-sampleapp.zip に変更しました (「ダウンロード」を参照)。

よく使われる頭文字語

  • ADT: Android Development Tools
  • API: Application Program Interface
  • IDE: Integrated Development Environment
  • JDK: Java Development Kit
  • JSON: JavaScript Object Notation
  • 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 とその API を理解することが重要です。Facebook によれば、Facebook Platform によって、誰でも「Facebook 上や Web 上でソーシャル・アプリケーションを作成する」ことができるようになります。そうしたアプリケーションを作成できるように、Facebook にはコアとなる高度な API と SDK が豊富に用意されています (「参考文献」を参照)。

Facebook Platform API のコアとなる Graph API を使用して、Facebook からデータを読み取ったり、Facebook にデータを書き込んだりすることができます。また Facebook には、いわゆる Old Rest API もあります。新しい Graph API では API の仕組みが変更され、主にメソッドによって Facebook との間でデータを読み書きする方式から、オブジェクト (例えばユーザー・プロフィール、友達、投稿記事、写真、「いいね!」ボタンなど) およびオブジェクト間の関係や接続を使用する新しい方式に変更されています。この方式によって Facebook API は単純化され、より一貫した方法でオブジェクトを処理できるようになりました。Facebook API として推奨されるのは Graph API ですが、Old REST API も変わらず有効でありサポートされていることに注意してください。Graph API と REST API のどちらもモバイル・アプリケーション (ネイティブ Web アプリケーションと、モバイル Web アプリケーションの両方) に使用することができます。なお、このモバイル・アプリケーションには、WebViews を使用したネイティブ・アプリケーション内でのモバイル Web コンテンツも含まれます。

Graph API のオブジェクトには一意の ID が割り当てられ、また URL を使うことで Graph API のオブジェクトのアドレスを容易に指定することができます (この URL をさらに修飾することで、特定のオブジェクトや接続を指定することができます)。オブジェクトの URL の一般的な構造は、https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE です。ここで OBJECT_ID にはオブジェクトの一意の ID が指定され、CONNECTION_TYPE にはそのオブジェクトでサポートされている接続タイプの 1 つが指定されます。例えば、ページがサポートする接続には、フィード/ウォール、写真、ノート、記事投稿、およびメンバーなどがあります。

Graph API を使用することで、オブジェクトを取得したり、削除したり、公開したりすることができます。さらに、オブジェクトを検索、更新したり、結果をフィルタリングしたり、あるオブジェクトの接続や関係を動的に発見したりすることさえできます。

デフォルトで、アプリケーションはユーザーの公開データにアクセスすることができます。非公開データにアクセスするためには、アプリケーションはまず、ユーザーに関する権限 (拡張権限と呼ばれます) を要求する必要があります。Facebook には多数の権限が定義されており、それらは Extended Permissions (拡張権限) について記載されているページで説明されています (「参考文献」を参照)。


Facebook SDK for Android 入門

ここまでで、Facebook Platform API についてはよく理解できたことと思うので、今度は Facebook SDK for Android を調べてみましょう。

Facebook SDK for Android は、Facebook の Graph API と Old REST API に対する Java プログラミング言語によるラッパーです。この SDK はオープンソースであり、github の facebook / facebook-android-sdk リポジトリーでホストされています (「参考文献」を参照)。この SDK はオープンソースとして成長を続けているため、将来的には変更される可能性があることに注意してください。Facebook SDK for Android は、Apache License のバージョン 2.0 の下でライセンスされています。

Facebook SDK for Android により、この前のセクション「Facebook Platform API の概要」で説明した詳細事項の多くを意識せずにすむようになります。これは Facebook SDK for Android の 6 つの Java クラス (表 1) によって実現されています。

表 1. com.facebook.android パッケージ
クラス説明
AsyncFacebookRunnerFacebook API の非同期呼び出しを実装するヘルパー・クラス
DialogErrorダイアログ・エラーをカプセル化するクラス
FacebookFacebook Platform API とやり取りする、メインの Facebook クラス
FacebookErrorFacebook エラーをカプセル化するクラス
FbDialogFacebook スタイルのダイアログ用の WebView を実装するクラス
Utilいくつかのユーティリティー・メソッドを持つヘルパー・クラス

また Facebook SDK for Android には実用的な用例もいくつか含まれており、これらの用例を皆さんのアプリケーションのベースとして使用することができます。

コアとなる Facebook クラスと、FbDialog クラスは特に興味深いので、さらに詳しく説明します。コアとなる Facebook クラスによってカプセル化されているメソッドには、ユーザーを認可するメソッドや、Facebook スタイルのダイアログを作成するメソッド、API リクエストを実行するメソッド、ユーザーをログアウトするメソッド、そしてアクセスやセッションの情報とステータスを取得または設定するメソッドがあります。FbDialog クラスは WebView を実装していますが、さらに WebView を作成するためのメソッド、および Facebook の URL (ステータス) レスポンスを処理するためのロジックも実装しています。ダイアログは、この SDK の動作の中心となるものです。Facebook SDK for Android には 2 つの認証方法が用意されています。1 つはシングル・サインオンと呼ばれる方法で、ネイティブの Facebook アプリケーションのダイアログがインストールされている場合には、そのダイアログを使用します。もう 1 つは、デフォルトの WebView をダイアログに使用する方法です。この記事では WebView を使用する方法に焦点を絞ります。その他の SDK クラスはヘルパー・クラスであり、エラー情報をカプセル化するために使用されたり、SDK 全体で利用される便利なユーティリティーを提供するために使用されたりします。

今後のセクションでは、以下に示す典型的な Facebook アプリケーションの使用事例に焦点を当てます。

  • Facebook SDK for Android をインストールする
  • アプリケーションを登録する
  • SampleApp を作成する
  • Facebook スタイルのダイアログを表示する
  • ユーザーを認可する
  • API リクエストを実行する

Android SDK をインストールする

まず、Eclipse または皆さんのお気に入りの IDE をダウンロードしてインストールする必要があります。また、Android SDK もインストールする必要があります。Eclipse と Android SDK のダウンロード方法とインストール方法については、「Android Developers」Web サイトの「Download the Android SDK」ページを参照してください (「参考文献」を参照)。


Facebook SDK for Android をインストールする

Facebook SDK for Android は、github の facebook / facebook-android-sdk リポジトリーにホストされています。この SDK のソースをダウンロードし、作業ディレクトリーに解凍します。続いて Eclipse を起動し、Android プロジェクトを作成します。Android プロジェクトを作成するには、Eclipse のメニューで「File (ファイル)」 -> 「New (新規)」 -> 「Project (プロジェクト)」の順に選択し、「Android」配下にある「Android Project (Android プロジェクト)」を選択します。表示される「New Android Project (新規 Android プロジェクト)」ウィザードでは、「Creating project from existing source (外部ソースからプロジェクトを作成)」を選択し、解凍されたソース・ディレクトリーを指定します (ソース・コードについては「ダウンロード」を参照)。


アプリケーションを登録する

最初に Facebook アプリケーションを登録し、アプリケーションの ID (client_id) と、ID に関連付けられた秘密鍵 (client_secret) を取得する必要があります。クライアント ID はアプリケーションの中で、さまざまな Facebook API を呼び出す際に使用されます。


サンプル・アプリケーション

ここではサンプル・アプリケーションを用いて Facebook SDK for Android の使用方法を説明します。簡単にするために、このサンプル・アプリケーションを SampleApp と呼ぶことにします。このアプリケーションは SampleApp のアクティビティーを実装する 1 つのファイルで構成され、1 つの画面を使用して、メッセージ、Facebook の友達リスト、およびメニュー項目を表示します。メニュー項目には、ユーザーのログイン/認証、友達リストの取得、および認証されたユーザー (me) のウォールへの投稿が含まれています。

作業を始める前に、先ほど説明したように、アプリケーションを Facebook に登録する必要があり、また SampleApp.java の APP_ID 属性を、Facebook から提供された client_id に設定する必要があることを忘れないでください (リスト 1)。

リスト 1. アプリケーションの ID を初期化する
// Set application ID to your registered app client_id
// See http://www.facebook.com/developers/createapp.php
public static final String APP_ID = ".....";

このサンプル・アプリケーションの画面ではリニア・レイアウトを採用しています。このレイアウトには、単純なステータス・メッセージ用の TextView、サーバーから取得した Facebook の友達リストを表示するための ListView、およびメニュー項目 (ユーザーのログイン/認証、友達リストの取得、および認証されたユーザー (me) のウォールへの投稿) が含まれています。リスト 2 に、メインの UI 画面をレイアウトする XML による UI 宣言を示します。

リスト 2. メイン画面の UI 宣言
<?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 に、ListView の行のための XML による UI 宣言を示します。

リスト3. ListView の行の UI 宣言
<?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 による UI 宣言を示します。

リスト 4. メニュー項目の UI 宣言
<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 の XML による UI 宣言の結果を示します。ログイン前は「Login (ログイン)」ボタンがアクティブに表示され、ログイン後は「Logout (ログアウト)」ボタン、「Get Friends (友達の取得)」ボタン、および「Wall Post (ウォールへ投稿)」ボタンがアクティブに表示されます。

図 1. SampleApp 画面のレイアウト
SampleApp のログイン前の画面レイアウトのスクリーン・キャプチャー

SampleApp の onCreate() メソッドは、SampleApp インスタンスが作成されるときに、Android プラットフォームによって呼び出されます。このメソッドは、まず処理を進める前にアプリケーションの ID が設定されているかどうかの基本的なチェックを実行し、続いて UI リソースを初期化した後、Facebook セッションのインスタンスを初期化します (リスト 5)。

リスト 5. アプリケーションを初期化する
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Make sure the app client_app has been set
    if (APP_ID == null) {
        Util.showAlert(this, 
        "Warning", "Facebook Application ID must be set...");
    }

    // Initialize the content view
    setContentView(R.layout.main);
    // Get the status text line resource
    mText = (TextView) SampleApp.this.findViewById(R.id.txt);

    // Setup the ListView Adapter that is loaded when selecting "get friends"
    listView = (ListView) findViewById(R.id.friendsview);
    friendsArrayAdapter = new FriendsArrayAdapter(this, R.layout.rowlayout, friends);
    listView.setAdapter(friendsArrayAdapter);

    // Define a spinner used when loading the friends over the network
    mSpinner = new ProgressDialog(listView.getContext());
    mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE);
    mSpinner.setMessage("Loading...");

    // Initialize the Facebook session
    mFacebook = new Facebook(APP_ID);
    mAsyncRunner = new AsyncFacebookRunner(mFacebook);

}

他のアプリケーション・フローは、メニュー項目を介した UI とのやり取りによってトリガーされます。リスト 4 に示したように、このアプリケーションには 3 つのメニュー項目が定義されています。つまり、1) ログイン/ログアウト (交互に切り換え)、2) 友達の取得、3) ウォールへ投稿、の 3 つです。ユーザーが 1 つのメニュー項目を選択すると、アプリケーションはその項目に応じた適切なアクションを実行します。以下のリストはメニュー項目の処理方法を示しています。リスト 6 に、メニューの XML 定義を拡張することによって、メニューをインスタンス化する方法を示します。

リスト 6. メニューを作成する
/**
 * Invoked at the time to create the menu
 * @param the menu to create
 */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return true;
}

リスト 7 に、表示前にメニュー項目を変更する方法を示します。つまりこの方法により、適切な状態 (「ログイン」状態または「ログアウト」状態) を表示し、「get friends (友達の取得)」および「post to wall (ウォールへ投稿)」を必要に応じて有効あるいは無効にすることができます。

リスト 7. メニューを作成する
/**
 * Invoked when preparing to display the menu
 * @param menu is the menu to prepare
 */
@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 に、メニュー項目の処理方法と、適切なアクション (ログイン/ログアウト、友達の取得、ウォールへ投稿) を呼び出す方法を示します。

リスト 8. メニュー項目の選択を処理する
/**
 * Invoked when a menu item has been selected
 * @param item is the selected menu item
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        // Login/logout toggle
        case R.id.login:
            // Toggle the button state. 
            //  If coming from login transition to logout.
            if (mFacebook.isSessionValid()) {
                AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(mFacebook);
                asyncRunner.logout(this.getBaseContext(), new LogoutRequestListener());
            } else {
                // Toggle the button state. 
                //  If coming from logout transition to login (authorize).
                mFacebook.authorize(this, PERMISSIONS, new LoginDialogListener());
            }
            break;

        // Wall Post
        case R.id.wallpost: // Wall Post
            mFacebook.dialog(SampleApp.this, "stream.publish", new 
                                                  WallPostDialogListener());
            break;

        // Get Friend's List
        case R.id.getfriends: // Wall Post
            // Get the authenticated user's friends
            mSpinner.show();
            mAsyncRunner.request("me/friends", new FriendsRequestListener());
            break;

        default:
            return false;

    }
    return true;
}

このアプリケーションでは、いくつかのコールバックを使用することによって、各非同期呼び出しの状態を処理します。SampleApp に定義されているコールバックでは、ログイン・リクエスト、ログアウト・ダイアログ、ウォールへの投稿ダイアログ、および友達取得のリクエストがそれぞれ成功したとき、あるいは失敗したときの処理を行います。このサンプル・アプリケーションを基にして、皆さん独自のアクションを追加するには、単純に同じパターンに従ってメニューを追加し、それらのメニューに対応した Facebook への呼び出しと、呼び出しに対応して状態を示すメッセージを受信するためのコールバックを追加すればよいのです。

メニュー項目から「Login (ログイン)」が選択された場合と、「Wall Post (ウォールへ投稿)」が選択された場合の両方で Facebook スタイルのダイアログが呼び出されますが、シングル・サインオン・オプションが定義されていない場合は、デフォルトで SDK の WebView ベースのダイアログが使用されます。これについては次のセクションで説明します。

FriendsRequestListener コールバックについては、「Facebook API リクエストを実行する」で説明します。最後のコールバックである MyDialogListener は、Facebook SDK for Android の DialogListener を実装しています。DialogListener は、SDK の WebView ベースのダイアログを使用する Facebook リクエストで使用されます。これについては次のセクションで説明します。DialogListener を実装する場合には、適切な完了ロジックを実装する必要があります。例えば、このロジックは、ログイン・リクエストとウォールへの投稿リクエストの際に使用されます。


Facebook スタイルのダイアログを表示する

Facebook SDK for Android では、Web ベースあるいはサーバー・ベースの Facebook スタイルのダイアログを使用して、ユーザーとのやり取りを行います (ユーザーの認可、権限付与、およびメッセージの公開など)。この SDK のコアとなる Facebook.java クラスは dialog() メソッドを定義し、このメソッドによりリクエスト・アクション用の UI ダイアログが生成されます (リスト 9)。

リスト 9. Facebook の dialog メソッド
/**
 * Generate a UI dialog for the request action in the given Android context
 * with the provided parameters.
 */
public void dialog(
        Context context, 
        String action, 
        Bundle parameters,
        final DialogListener listener) {
    :
    :
}

この非同期メソッドは入力の引数として、アプリケーションのコンテキスト、実行するアクション (loginpublish_streamread_stream、および offline_access など)、特定のリクエストまたはアクションに必要なパラメーター、およびこの非同期メソッドの実行が完了すると呼び出されるリスナー・メソッドを取ります。このメソッドによって適切な WebView ダイアログが作成されます。例えばステータス・メッセージを公開するためには、コアとなる Facebook クラスの dialog() メソッドを呼び出し、アクションとして stream.publish を渡します (リスト 10)。

リスト 10. dialog() メソッドを呼び出し、コールバックを処理する
package com.myapp.facebook.android;
:

import com.facebook.android.*;
:

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

// Create a Facebook dialog (using the call asynchronous API)
mFacebook.dialog(
    this,
    "stream.publish", 
    new MyDialogListener());   

:
:

//
// My asynchronous dialog listener
//
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() {...}

}

この呼び出しの結果、Facebook のウォールに投稿するための Web ベースのダイアログが表示されます (図 2)。

図 2. ウォールに投稿する
ウォールに投稿するためのダイアログのスクリーン・キャプチャー

これは Facebook でユーザーのウォールに投稿するための、おなじみの Web ページです。ユーザーはこのページをスキップするか、あるいはこのページからメッセージを公開することができます。このように同じモバイル・アプリケーションの中でネイティブ・コンテンツと Web コンテンツとを同時に使用できる点は、ハイブリッド・アプリケーションの能力を示す非常に良い例です。


ユーザーを認可する

Facebook Platform は OAuth 2.0 認証をサポートすると同時に、カスタムの承認署名による古い方式もサポートしています。ただし、新しいアプリケーションを作成する場合は、古い認証方式を使用しないでください。古い方式は近い将来サポートされなくなる可能性があるからです。OAuth についての詳しい情報は、「参考文献」に挙げた OAuth 2.0 プロトコルの仕様を参照してください。

Facebook SDK for Android と Facebook Platform とを組み合わせることにより、OAuth 認証の複雑さを意識する必要がなくなります (図 3)。

図 3. OAuth 2.0 プロトコル (IETF)
OAuth 2.0 プロトコル (IETF) の図

Facebook SDK for Android では、ネイティブ方式ではなく、モバイル Web 方式で認証を行います。この SDK の今後のバージョンでは、Android で OAuth をネイティブ・サポートできるようになる可能性があることに注意してください。モバイル Web 方式の場合に、この SDK が使用するのは Facebook の WebView 内部にある Web ベースの認証ダイアログです。これは以下の点で興味深い方式です。

  • この方式により、アプリケーションに OAuth をネイティブ実装する複雑さが軽減されます。
  • 上記と同じくらい重要な点は、通常のブラウザー上で Facebook を使用する場合と変わらない、標準的で見慣れたログイン・ダイアログと権限付与ダイアログが表示されるため、ユーザーの信頼を得られる点です。

この方式の欠点の 1 つは、純粋にネイティブ実装した場合よりも動作が遅く感じられる場合があることです。そのため、この SDK には代わりの認証/ログイン方式として、ネイティブの Facebook アプリケーションのシングル・サインオンを使用する方式が含まれています。公式の Facebook ネイティブ・アプリケーションが携帯電話にインストールされている場合には、そのアプリケーションの認可アクティビティーやログイン・アクティビティーを Facebook SDK for Android で使用することができます。しかしそのためには、最初にアプリケーションに署名してから (「参考文献」に挙げた Frank Ableson の記事、「Introduction to Android Security」を参照)、シグニチャー、つまり鍵のハッシュを生成する必要があります (リスト 11)。

リスト 11. アプリケーションの鍵のハッシュを生成する
keytool -exportcert -alias [alias] -keystore [keystore] | openssl sha1 -binary | 
                                                                          openssl base64

リスト 11 のコマンドは、通常 1 行で入力されて表示されることに注意してください。ここでは体裁上の理由で 2 行に分割されています。

次に、Facebook で生成された鍵のハッシュを、図 4 のように「Mobile and Devices (モバイルおよび機器)」セクションの特定のアプリケーションに登録する必要があります。

図 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);
  :
  :
  // ... Other onActivityResult steps per your app...
}

シングル・サインオン・メソッドが定義されていない場合、またはネイティブの Facebook アプリケーションが存在しない場合は、この SDK はデフォルトで WebView 方式の認証/ログインを行うことに注意してください。この記事の残りの部分では、このデフォルトの方式に焦点を当てて説明します。

先ほど説明したように、アプリケーションはデフォルトで、ユーザー・プロフィールの中にあるすべての公開データにアクセスすることができます。非公開データにアクセスするためには、アプリケーションは非公開データにアクセスする権限を要求し、ユーザーから権限を付与してもらう必要があります。非公開データへのアクセス権限は拡張権限と呼ばれます。

Facebook SDK for Android の authorize() メソッドは、OAuth 2.0 のユーザー・エージェント・フローを実装することで、その後の API リクエストで使用するアクセス・トークンを取得します。authorize() メソッドは、アクティビティーを起動するか (ネイティブの Facebook アプリケーションが存在して構成されている場合)、WebView ダイアログを起動し、ユーザーにクレデンシャルの入力 (認証) と権限の付与 (認可) を促します (リスト 13)。

リスト 13. 認可 (authorize) メソッド
/**
 * Authorize method that grants custom permissions.
 */
public void authorize(Activity activity, String[] permissions,
        final DialogListener listener) {
    :
    :
}

シングル・サインオンによる認証が適切に動作するためには、onActivityResult() 関数の中に authorizeCallback() メソッドの呼び出しを含める必要があることに注意してください。

リスト 8 で、権限が付与された authorize() メソッドが、ログイン・メニュー項目によって呼び出されていることを思い出してください。

リスト 14 に、コンテンツを書き込む権限が付与された authorize() メソッドを呼び出す方法を示します。この authorize() メソッドには、コメントを書き込んだり、「いいね!」ボタンを押したりするための権限 (publish_stream)、ユーザーのフィードを読み取り、検索を実行するための権限 (read_stream)、およびアクセスするためのクレデンシャルの期限を長く設定するための権限 (offline_access) なども付与されています。APP_ID にはご自分の 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"};

:
:

// Call the authorization method
mFacebook.authorize(
    getContext(), 
    APP_ID, 
    mPermissions,
    new MyLoginDialogListener());

:
:

// Asynchronous Callback when authorization completes
private final class MyLoginDialogListener implements com.facebook.android
          .Facebook.DialogListener {

    public void onComplete(Bundle values) {...} // here enable logout
    public void onFacebookError(FacebookError error) {...}
    public void onError(DialogError error) {...}
    public void onCancel() {...}
}

authorize() メソッドは、先ほど説明した dialog() メソッドを内部で呼び出しますが、この場合はアクションのためのログイン・リクエストを渡します。Facebook Platform および OAuth の実装を利用することにより、authorize() メソッドは Facebook に対する認証リクエストを処理し、access_token を返すこともできます。access_token は、https://graph.facebook.com/ID?access_token=... のように、すべての Facebook セッションと API 呼び出しで使用されます。

認証がどのように動作するかについての詳細情報は、「参考文献」に挙げた Facebook Authentication のページを参照してください。

authorize() メソッドを呼び出すと、図 5 のような WebView ベースのダイアログが表示されます。

図 5. 認可および権限付与を行うための画面 (WebView)
WebView ベースのダイアログのスクリーン・キャプチャー

ユーザーのログイン後に、他のアプリケーションから権限付与の要求があった場合、ユーザーには権限の付与の選択が (E メールまたは電話番号と、パスワードの入力とともに) 促されます。ユーザーは、権限を要求してきたアプリケーションが自分の Facebook にアクセスして、アクションを実行することを許可または拒否することができます。対象となるアクションとしては、基本情報へのアクセス、ユーザーのウォールへの投稿、ニュース・フィードに投稿された記事へのアクセス、ユーザー・データへのアクセスなどがあります。


Facebook API リクエストを実行する

コアとなる Facebook クラスには、Old REST API と Graph API を呼び出すための request() メソッドがいくつか実装されています。また Facebook SDK for Android には、コアとなるリクエスト API の呼び出しを非同期に行えるようにする、ヘルパー・ラッパー・クラスもあります。

ここでは API リクエストの例として、認証されたユーザーの友達を取得するためのリクエストを実行してみます。Graph API は以下のような構造であることを思い出してください。

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

また、認証されたユーザーを識別するために使用される特殊な ID である me を思い出してください。つまり、ユーザーは https://graph.facebook.com/me/friends としてログインしています。

リスト 15 は、リスト 8 から request() メソッドを呼び出す部分を抜粋したスニペットです。この例では AsyncFacebookRunner.request(...) メソッドを使っています。このメソッドはヘルパー・ラッパー・メソッドであり、独自のスレッド内で実行されるため、ラップされたリクエスト・メソッドは非同期に実行されるようになります。このステップは、メインの UI スレッドがブロックされるのを防ぐために実行されます。

リスト 15. リクエストを非同期にディスパッチする
// Get Friend's List
case R.id.getfriends: // Wall Post
    // Get the authenticated user's friends
    mSpinner.show();
    mAsyncRunner.request("me/friends", new FriendsRequestListener());
    break;

FriendsRequestListener の onComplete(...) コールバックは、友達リストを取得するためのリクエストの実行が完了すると呼び出されます。このメソッドは、JSON で返された友達リストの構文解析を行います。実装されたメソッドのすべてが、リスト 16 に含まれているわけではないことに注意してください。

リスト 16. 友達を取得するためのリクエストを処理する
/**
 * FriendsRequestListener implements a request lister/callback
 *  for "get friends" requests
 */
public class FriendsRequestListener implements 
        com.facebook.android.AsyncFacebookRunner.RequestListener {

    /**
     * Called when the request to get friends has been completed.
     * Retrieve and parse and display the JSON stream.
     */
    public void onComplete(final String response) {
        mSpinner.dismiss();
        try {
            // process the response here: executed in background thread
            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);
            }

            // Only the original owner thread can touch its views
            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 を使うことも、この SampleApp のように ListView を使うこともできます (図 6)。

図 6. 結果を表示する
リクエストの結果として名前と ID の一覧が表示された画面のスクリーン・キャプチャー

まとめ

この記事では Facebook の API について説明しました。最初に Facebook Platform と、その API の概要を説明し、次に Facebook SDK for Android とサンプル・アプリケーションについて説明しました。この記事を読んだことで、Facebook で利用できるさまざまな API と、Android プラットフォームで Facebook アプリケーションの作成を開始する方法についての理解がさらに深まったことでしょう。


ダウンロード

内容ファイル名サイズ
Article source codefb_sampleapp.zip12KB

参考文献

学ぶために

製品や技術を入手するために

  • Facebook SDK for Android (現在はアルファ・リリース) ライブラリーを利用して Facebook を Android モバイル・アプリケーションに組み込んでください。
  • Facebook Platform を利用して、Facebook と Web でソーシャル・アプリケーションを構築するスキルを磨いてください。
  • Facebook の Old Rest API (Graph API の前のバージョン) を利用すると、単純な HTTP リクエストを使用して Facebook Web サイトとプログラムでやり取りすることができます。
  • Facebook Platform のコア API である Facebook Graph API (最新バージョン) を詳しく調べてください。
  • OAuth 2.0 プロトコル仕様 (2010年7月) を調べ、Facebook Platform でサポートされている OAuth 認証を活用してください。
  • Android developers の公式サイトを訪れ、Android SDK をダウンロードし、API の資料にアクセスし、また Android に関する最新ニュースを入手してください。バージョン 1.5 またはそれ以降であれば構いません。
  • Android Open Source Project のサイトを訪れ、Android 互換の機器を作成するために必要なオープンソース情報とソース・コードを見つけてください。
  • Java Platform, Standard Edition の最新版、JDK 6 Update 21 を入手してください。
  • 最新の Eclipse IDE を入手してください。
  • Facebook SDK for Android の最新アルファ・リリースを入手してください。
  • IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2®、Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Open source
ArticleID=619587
ArticleTitle=Facebook API 入門
publish-date=12162010