메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Facebook API 소개

Android용 Facebook SDK로 Android 플랫폼용 Facebook 앱 쓰기

C. Enrique Ortiz, 모바일 기술자, IBM
C. Enrique Ortiz는 오랜 기간 동안 모바일 기술자이자 개발자이자 저자로서 일해 왔다. 블로그 주소는 About Mobility이며 Austin chapter of MobileMonday의 설립자이다.

요약:  Facebook 기능을 자체 애플리케이션에 통합할 수 있습니다. 모바일 관점에서 Facebook Platform은 모바일 웹 애플리케이션용 API를 지원하고, iPhone, iPad 및 Android 플랫폼에 대해서는 기본 모바일 애플리케이션용 모바일 SDK를 지원합니다. 이 기사에서는 Facebook Platform API와 Facebook 모바일 팀에서 릴리스한 SDK인 Android용 Facebook SDK에 대해 알아봅니다.

원문 게재일:  2010 년 12 월 16 일 (출판일: 2010 년 12 월 14 일) 번역 게재일:  2011 년 3 월 29 일
난이도: 초급 원문:  보기 PDF:  A4 and Letter (264KB | 26 pages)Get Adobe® Reader®
페이지뷰:  18641 회
의견:  


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의 개요

Android용 Facebook SDK를 다루기 전에 Facebook Platform과 그 API들을 이해하는 것이 중요하다. Facebook에 따르면, Facebook Platform을 통해 누구나 "Facebook과 웹에서 소셜 애플리케이션을 빌드"할 수 있다. 이러한 애플리케이션을 빌드하도록 사용하기 위해 Facebook에서는 핵심 및 고급 API와 SDK의 광범위한 콜렉션을 제공한다(참고자료 참조).

핵심 Facebook Platform API는 Facebook으로, Facebook에서부터 데이터를 읽고 쓸 수 있는 Graph API이다. Facebook은 또한 Old Rest API도 보유하고 있다. 최신의 Graph API는 API 패러다임을 Facebook으로 및 Facebook에서부터 데이터 읽기 및 쓰기의 메소드 지향 방식에서부터 오브젝트들(사용자 프로필, 친구들, 포스트, 사진, 좋아요 기타 등등을 생각해보자) 및 그 관계들 또는 서로 간의 연결들을 사용하는 새 방식으로 변경한다. 이 접근방식을 사용하면 Facebook API가 간소화되고 오브젝트들로 작업할 때에 더 일관적으로 만들어준다. Graph API가 우선 Facebook API인 반면에, Old REST API는 여전히 활성화되고 지원됨을 참고하자. Graph와 REST API는 둘 다 WebViews의 사용을 통해 기본 애플리케이션 내에서 모바일 웹 콘텐츠를 포함하는 기본 및 모바일 웹 애플리케이션 둘 다인 모바일 애플리케이션들에 적용 가능하다.

Graph API 오브젝트들은 고유 ID가 지정되었으며, 더 나아가 특정 오브젝트/연결을 주소 지정하도록 규정할 수 있는 URL을 사용하여 간편하게 자체 주소를 가진다. 오브젝트 URL의 일반 구조는 https://graph.facebook.com/OBJECT_ID/CONNECTION_TYPE이며, 여기에서 OBJECT_ID는 오브젝트의 고유 ID이고 CONNECTION_TYPE은 오브젝트로 지원되는 연결 유형 중 하나이다. 예를 들어, 페이지는 피드/담벼락, 사진, 노트, 글, 멤버, 기타 등등으로의 연결들을 지원한다.

Graph API를 통해 오브젝트를 검색하고, 오브젝트를 삭제하며, 오브젝트들을 게시할 수 있다. 검색하고, 오브젝트를 업데이트하며, 결과를 필터하며 심지어 오브젝트의 연결/관계를 동적으로 발견할 수도 있다.

기본값으로 애플리케이션들은 사용자의 공용 데이터에 액세스가 있다. 개인용 데이터에 액세스하기 위해 애플리케이션에서는 먼저 사용자의 권한을 요청해야 하며, 이를 확장 권한이라고 한다. Facebook은 확장 권한 페이지에서 읽을 수 있는 권한들을 많이 정의한다(참고자료 참조).


Android용 Facebook SDK 소개

이제 Facebook Platform API에 대해 더 잘 이해하게 되었으니 Android용 Facebook SDK에 대해 살펴보자.

Android용 Facebook SDK는 Facebook Graph 및 이전 REST API로의 Java 프로그래밍 언어 랩퍼이다. 이 SDK는 오픈 소스이며, github의 facebook / facebook-android-sdk 저장소에 호스트된다(참고자료 참조). 오픈 소스 SDK의 진화하는 성향으로 인해 향후 SDK의 변경을 예상하는 것을 참고하자. SDK는 Apache License, 버전 2.0에 의해 라이센스화되었다.

Android용 Facebook SDK는 이전 섹션인 Facebook Platform API의 개요에서 다루었던 세부사항들을 많이 숨기고 있다. 이는 표 1에서 설명하는 대로 여섯 개의 Java 클래스들을 제공하여 진행된다.


표 1. Package com.facebook.android
클래스설명
AsyncFacebookRunner비동기 Facebook API 호출을 구현하는 헬퍼 클래스
DialogError대화 상자 오류를 요약하는 클래스
FacebookFacebook Platform API와의 상호작용을 위한 기본 Facebook 클래스
FacebookErrorFacebook 오류를 요약하는 클래스
FbDialogFacebook 대화 상자의 WebView를 구현하는 클래스
Util많은 유틸리티 메소드들이 있는 헬퍼 클래스

Android용 Facebook SDK는 또한 자체 애플리케이션의 기준선으로 사용할 수 있는 유용한 몇 가지 예제를 도입한다.

특별히 관심을 끄는 것은 핵심 Facebook 클래스와 Facebook Dialog 클래스이며, 이는 다음에 더 자세히 다루게 된다. 핵심 Facebook 클래스는 사용자의 권한을 부여하고, Facebook 대화 상자를 작성하고, API 요청을 수행하고, 사용자를 로그아웃하며, 액세스와 세션 정보 및 상태를 받거나 설정하는 메소드들을 요약한다. Facebook Dialog 클래스는 Webview와 그 생성을 위한 메소드 및 Facebook URL(상태) 응답을 처리하기 위한 로직도 구현한다. 대화 상자는 SDK가 운영하는 방식에 중요하다. SDK는 인증하는 메소드를 두 가지 제공한다. 하나는 설치된 경우, 기본 Facebook 애플리케이션 대화 상자를 사용하는 싱글 사인온으로 참조되고, 나머지는 대화 상자로의 기본값 WebView 접근방식이다. 이 기사에서는 WebView 접근방식에 대해 집중할 것이다. 나머지 SDK 클래스들은 오류 정보를 요약하거나 SDK 내내 사용되는 유용한 유틸리티를 제공하는 데 사용되는 헬퍼 클래스들이다.

다음 섹션들은 일반 Facebook 애플리케이션의 유스케이스에 주목한다.

  • Android용 Facebook SDK 설치하기
  • 자체 애플리케이션 등록하기
  • SampleApp 작성하기
  • Facebook 대화 상자 표시하기
  • 사용자 권한 부여하기
  • API 요청 작성하기

Android SDK 설치하기

Eclipse나 좋아하는 IDE를 다운로드하고 설치해야 한다. 추가로 Android SDK를 설치해야 한다. Eclipse와 Android SDK를 다운로드하고 설치하는 방법에 대한 내용은 Android Developer 웹 사이트의 Android SDK 다운로드 페이지를 참조하자(참고자료 참조).


Android용 Facebook SDK 설치하기

Android용 Facebook SDK는 github의 facebook / facebook-android-sdk 저장소에 호스트된다. SDK 소스를 다운로드하여 이를 작업 디렉토리로 추출한다. Eclipse를 시작하고 File Menu -> New -> Project를 선택하여 Android Project를 생성하고 Android Project를 선택한다. existing source에서부터 프로젝트를 작성하여 추출된 소스 디렉토리로 향하게 한다(소스 코드는 다운로드 참조).


자체 애플리케이션 등록하기

시작하기 전에 Facebook 애플리케이션을 등록하고 애플리케이션 ID(client_id)와 연관된 비밀 키(client_secret)를 받아야 한다. 클라이언트 ID는 다른 Facebook API를 호출할 때에 자체 애플리케이션에 사용된다.


샘플 애플리케이션

간단히 하기 위해서 SampleApp이라는 이름의 샘플 애플리케이션은 Android용 Facebook SDK를 사용하는 방법을 보여준다. 애플리케이션은 SampleApp 액티비티를 구현하고, 하나의 화면을 사용하여 메시지, 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와 사용자 로그인/인증하고 친구의 목록을 얻고 인증된 사용자의(내) 담벼락에 글을 게시하는 메뉴 항목들이 들어있는 선형 레이아웃을 사용한다. 리스트 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은 로그인 이전(Login 단추 사용)과 이후(Logout, Get Friends 및 Wall Post 단추 사용)에 SampleApp에 대한 XML UI 선언의 결과를 보여준다.


그림 1. SampleApp 화면 레이아웃
SampleApp에서 사전 로그인 및 사후 로그인 화면 레이아웃의 화면 캡처

SampleApp onCreate() 메소드는 SampleApp 인스턴스가 작성될 때에 Android 플랫폼으로 호출된다. 이 메소드는 처리 이전에 App 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에서 실례로 보여주는 1) 로그인/로그아웃(login/logout)(토글), 2) 친구 목록 가져오기(get friends) 및 3) 담벼락에 전송(post to the wall)으로 정의한다. 사용자가 메뉴 항목을 선택하면 애플리케이션은 적절한 조치를 수행한다. 다음 목록에서 메뉴 항목들이 어떻게 처리되는지 보여준다. 리스트 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은 메뉴 항목들이 표시되기 전에 어떻게 수정되는지 보여준다. 다시 말해서, 적절한 "로그인" 또는 "로그아웃" 상태를 보여주고 "친구 찾기"와 "담벼락에 전송"을 사용하거나 사용 안 한다.


리스트 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으로의 해당되는 호출과 메뉴 추가의 동일한 패턴을 따라 자체 조치를 추가할 수 있다.

로그인과 "담벼락에 전송" 메뉴 항목들은 둘 다 Facebook 대화 상자를 호출하며, 이는 싱글사인온 옵션이 정의되지 않은 경우 기본값으로 SDK WebView 기반 대화 상자를 사용한다. 다음 섹션에서 이 내용을 설명한다.

FriendsRequestListener 콜백은 Facebook API 요청 작성하기에서 다룬다. 마지막 콜백인 MyDialogListener는 Android용 Facebook SDK DialogListener를 구현하며, 이는 다음 섹션에서 설명한 대로 SDK WebView 기반 대화 상자를 사용하는 Facebook 요청에 사용된다. DialogListener의 구현자는 적절한 완료 로직을 구현해야 한다. 예를 들어, 이는 로그인과 담벼락에 전송 요청 도중에 사용된다.


Facebook 대화 상자 표시하기

Android용 Facebook SDK는 사용자 권한 부여, 권한 및 메시지 게시 등과 같은 사용자 상호작용에 대해 Facebook 웹/서버 기반 대화 상자에 의존한다. 핵심 SDK Facebook.java 클래스는 요청 조치에 대한 UI 대화 상자를 생성할 때에 dialog() 메소드를 정의한다(리스트 9 참조).


리스트 9. Facebook 대화 상자 메소드

/**
 * 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) {
    :
    :
}

이 비동기 메소드는 입력에 대해 애플리케이션 컨텍스트, 수행하는 조치들(login, publish_stream, read_stream, offline_access), 특정 요청 또는 조치에 필요한 매개변수 및 비동기 메소드들이 실행을 완료할 때에 호출되는 리스너 메소드를 취한다. 이 메소드는 적절한 WebView 대화 상자를 작성한다. 예를 들어, 상태 메시지를 게시하려면 stream.publish 조치를 전달하는 핵심 Facebook 클래스 메소드 dialog()로 호출한다(리스트 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() {...}

}

이 호출의 결과는 그림 2와 같이 Facebook 웹 기반 담벼락에 전송 대화 상자이다.


그림 2. 담벼락에 전송하기
담벼락에 전송하기 대화 상자의 화면 캡처

이는 Facebook으로 제공되는 사용자의 담벼락에 전송하기의 익숙한 웹 페이지이다. 사용자는 건너뛰거나 앞으로 진행하여 메시지를 게시할 수 있다. 동일한 모바일 애플리케이션 내에서 기본 및 웹 콘텐츠를 이렇게 함께 사용하는 것은 하이브리드 애플리케이션의 성능을 보여주는 훌륭한 예제이다.


사용자 권한 부여하기

Facebook Platform은 OAuth 2.0 인증에 대한 지원과 함께, 이전의 사용자 정의 권한 부여 서명 스킴에 대해서도 지원을 제공한다. 가까운 시일 내에 사용이 불가능하게 될 이전 스킴에 대한 지원으로 새 애플리케이션들을 쓸 때에 이전 인증 스킴을 사용하는 것을 방지해야 한다. OAuth에 대한 자세한 정보는 참고자료에서 OAuth 2.0 Protocol 스펙을 참조하자.

Facebook Platform과 함께 Android용 Facebook SDK는 그림 3에 실례로 보여주는 OAuth 인증의 복잡성을 숨겼다.


그림 3. OAuth 2.0 Protocol(IETF)
OAuth 2.0 Protocol(IETF)의 다이어그램

Android용 Facebook SDK는 인증에 기본 대신에 모바일 웹 접근방식을 취한다. SDK의 향후 버전이 OAuth에 대한 기본 Android 지원을 제공할 수 있다는 점을 참고하자. 이 접근 방식의 경우 SDK는 WebView 내에 Facebook 웹 기반 인증 대화 상자를 사용한다. 이는 다음 몇 가지 이유들로 인해 흥미로운 접근방식이다.

  • 이는 OAuth 기본을 애플리케이션에 구현하는 복잡도를 줄여준다.
  • 아마 중요하게도 이는 정규 브라우저에서 Facebook을 사용할 때와 같이 동일한 표준과 익숙한 로그인 및 권한 대화 상자를 표시하여 사용자의 신뢰를 얻는다.

이 접근방식의 하나의 약점은 때로는 순수 기본 구현보다 더 느리게 느껴질 수 있다는 점이다. 이를 위해 SDK는 기본 Facebook 애플리케이션의 싱글 사인온을 사용하는 대체 인증/로그인 접근방식을 포함한다. 다시 말해서, 공식적인 Facebook 기본 애플리케이션이 핸드셋에 설치되는 경우 Android용 Facebook SDK가 그 권한 부여/로그인 Activity를 사용할 수 있다. 하지만 이를 작동하려면 먼저 애플리케이션을 서명하고(참고자료에서 Frank Ableson의 기사 "Android 개발 소개" 참조), 그 후에 서명 또는 키 해시를 생성해야 한다(리스트 11 참조).


리스트 11. 애플리케이션 키 해시 생성하기

keytool -exportcert -alias [alias] -keystore [keystore] | openssl sha1 -binary | 
                                                                          openssl base64

리스트 11의 코드가 일반적으로 하나의 행에 나타나는 것을 참고하자. 이는 형식화 목적으로 여러 행들로 나눠진다.

그 후에 그림 4와 같이 특정 애플리케이션에 대해 생성된 키 해시를 Facebook의 Mobile and Devices 섹션 아래에 등록해야 한다. (그림 4의 확대 버전 보기)


그림 4. 애플리케이션 키 해시 입력
키 해시 필드의 화면 캡처

한 번 등록하면 애플리케이션의 "액티비티 결과 핸들러"를 정의해야 한다. 즉, 리스트 12와 같이 facebook.authorizeCallback(...) 메소드를 호출해야 하는 onActivityResult(...)를 구현한다.


리스트 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 접근방식을 기본값으로 지정할 것이다. 기사의 나머지 부분은 이 기본값 접근방식에 초점을 맞춘다.

이미 언급한 대로 애플리케이션은 기본값으로 사용자의 프로필에 모든 공용 데이터로의 액세스가 있다. 개인용 데이터에 액세스하려면 애플리케이션은 요청해야 하고, 사용자는 애플리케이션 권한이 그렇게 수행하도록 인정해야 한다. 개인용 데이터에 액세스를 얻는 권한은 확장 권한(Extended Permissions)이라고 한다.

Android용 Facebook SDK authorize() 메소드는 OAuth 2.0 User-Agent 플로우를 구현하여 차후 API 요청에서 사용하기 위한 액세스 토큰을 검색한다. 메소드는 Activity(존재하여 구성된 경우, 기본 Facebook 앱) 또는 WebView 대화 상자 중 하나를 시작하여 사용자에게 신임 정보(인증) 및 권한(권한 부여)을 표시한다(리스트 13 참조).


리스트 13. 권한 부여 메소드

/**
 * Authorize method that grants custom permissions.
 */
public void authorize(Activity activity, String[] permissions,
        final DialogListener listener) {
    :
    :
}

싱글 사인온 인증이 올바르게 작동하기 위해 onActivityResult() 함수에서 authorizeCallback() 메소드로의 호출을 포함해야 하는 것을 참고하자.

리스트 8에서부터 로그인 메뉴 항목이 권한으로 authorize() 메소드를 어떻게 호출하는지를 기억해보자.

리스트 14는 콘텐츠를 쓰는 권한으로 authorize() 메소드를 어떻게 호출하는지 보여준다. 이는 또한 댓글과 좋아요를 쓰고(publish_stream), 사용자의 피드를 읽고, 검색을 수행하며(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"};

:
:

// 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() 메소드를 호출하지만, 이번에는 조치에 대해 Login 요청을 전달한다. Facebook Platform과 그 OAuth의 구현의 지원으로 authorize() 메소드도 Facebook으로 인증 요청을 처리하고 https://graph.facebook.com/ID?access_token=...과 같이 Facebook 세션과 API 호출을 통해 사용되는 access_token을 리턴한다.

인증이 작동하는 방식에 대한 자세한 내용은 참고자료의 Facebook Authentication 페이지를 참조하자.

authorize() 메소드를 호출하면 그림 5의 WebView 기반 대화 상자가 나타난다.


그림 5. 권한 부여 및 권한 화면(WebView)
WebView 기반 대화 상자의 화면 캡처

사용자가 로그인 한 후에 애플리케이션이 요청한 대로 권한에 대한 메시지(이메일 또는 전화 정보 및 비밀번호)가 표시된다. 사용자가 사용자의 Facebook에 액세스하고, 기본 정보에 액세스와 같은 조치를 수행하고, 사용자의 담벼락에 전송하고, 뉴스피드에서 글에 액세스하거나 사용자의 데이터에 액세스하는 애플리케이션 권한을 허용하거나 거부할 수 있다.


Facebook API 요청 작성하기

핵심 Facebook 클래스는 Old REST 및 Graph API 호출에 많은 request() 메소드들을 구현한다. 이 외에도 SDK는 핵심 요청 API 호출을 비동기적으로 만드는 헬퍼 랩퍼 클래스를 제공한다.

API 요청의 예제로서, 인증된 사용자의 친구들을 검색하도록 요청할 것이다. 다음 Graph API의 구조를 기억해보자.

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

또한 인증된 사용자를 식별하기 위해 사용되는 특수 ID me를 기억하자. 사용자는 https://graph.facebook.com/me/friends로 로그인하였다.

리스트 15request() 메소드 호출을 만드는 방법에 대한 리스트 8의 스니펫을 보여준다. 이 예제에서 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");
        }
    }

    :
    :
}

애플리케이션 요구사항에 따르면 JSON 형식인 Facebook 서버에서부터의 응답은 구문 분석되고 적절하게 처리되어야 한다. 이 SampleApp에서 WebView를 사용하거나 ListView를 사용하여 이러한 정보를 표시하도록 결정할 수 있다(그림 6 참조).


그림 6. 결과 표시하기
결과로 이름과 ID의 목록이 표시된 화면 캡처

결론

이 기사에서는 Facebook API에 대해 살펴보았다. Facebook Platform과 그 API에 대한 일반적인 개요로 시작하여, Android용 Facebook SDK와 샘플 애플리케이션으로 이어졌다. 이러한 정보를 통해 이제는 사용 가능한 다른 Facebook API들과 Android 플랫폼용 Facebook 애플리케이션 쓰기를 어떻게 시작하는지에 대해 더 잘 이해하게 되었다.



다운로드 하십시오

설명이름크기다운로드 방식
Article source codefb_sampleapp.zip12KBHTTP

다운로드 방식에 대한 정보


참고자료

교육

  • Facebook 모바일 웹 페이지: 휴대전화에 적합하게 형식화된 모든 웹 사이트에 제공된 것과 동일한 API를 사용하여 사용자 자체 모바일 애플리케이션에 Facebook을 통합하는 방법에 대해 살펴보자.

  • Create an Application - Facebook 개발자: Facebook 애플리케이션을 등록하자.

  • Extended permissions - Facebook 개발자: 애플리케이션이 개인용일 수 있는 사용자 프로파일의 다른 부분에 액세스해야 하거나 애플리케이션이 사용자 대신 Facebook에 컨텐츠를 공개해야 하는 경우 확장 권한을 요청하자.

  • 공식적인 Facebook 개발자 문서: 사회적 경험을 창출하여 웹 사이트에서 성장과 개입을 촉진할 수 있도록 하는 강력한 API에 대해 살펴보자.

  • Facebook Authentication: Facebook 플랫폼을 사용하여 애플리케이션을 개발할 때의 인증 및 권한 부여에 대해 살펴보자.

  • Facebook Developer Roadmap: 이 로드맵을 사용하여 코드 수정이 필요할 수 있는 변경사항에 대한 계획을 수립하자.

  • Develop Android applications with Eclipse(Frank Ableson, developerWorks, 2008년 2월): Android 애플리케이션을 개발하는 가장 쉬운 방법은 Eclipse를 사용하는 것이다. 이 developerWorks 튜토리얼에서 이 주제에 대한 모든 내용을 살펴보자.

  • Android 개발 소개(Frank Ableson, developerWorks, 2009년 5월): Android 플랫폼에 대한 소개 기사를 읽고 기본적인 Android 애플리케이션을 코딩하는 방법을 살펴보자.

  • Networking with Android(Frank Ableson, developerWorks, 2009년 6월): Android의 네트워킹 기능을 탐구하자.

  • Working with XML on Android(Michael Galpin, developerWorks, 2009년 6월): Android에서 XML을 처리하는 다양한 옵션과 이러한 옵션을 사용하여 자신만의 Android 애플리케이션을 빌드하는 방법을 배운다.

  • Under the Hood of Native Web Apps for Android: 하이브리드 Android 애플리케이션에 관해 배워보자.

  • Unlocking Android(Frank Ableson, Manning Publications, 2010년): 이 책에서 Android 개발의 모든 측면을 살펴보자.

  • Mobile Design and Development(Brian Fling, O'Reilly Media, 2009년): 이 책에서 모바일 제품을 빌드하는 데 필요한 우수 사례와 실용적 지침, 표준, 기술에 관해 알아보자.

  • Android SDK 문서: Android API 참조에서 최신 정보를 얻자.

  • android.webkit 패키지에 대한 문서 온라인: WebView 제어를 설정하는 것에 대한 자세한 내용을 찾아보자.

  • Open Handset Alliance: Android를 후원하는 OHA(Open Handset Alliance)를 방문해보자.

  • 필자의 더 많은 기사(C. Enrique Ortiz, developerWorks, 2004년 7월 - 현재): Android, 모바일 애플리케이션, 웹 서비스 및 기타 기술에 대한 기사를 읽어보자.

  • developerWorks의 XML 영역: XML 영역에서 기술 향상에 도움이 되는 참고자료를 얻을 수 있다.

  • My developerWorks: developerWorks와 관련된 경험을 개인화할 수 있다.

  • IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.

  • XML 기술 자료: developerWorks XML 영역에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다. 또한 더 많은 XML 팁을 읽어본다.

  • developerWorks 기술 행사 및 웹 캐스트: 이러한 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.

  • Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.

  • developerWorks podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.

  • developerWorks on-demand demos: 입문자를 위한 제품 설치 및 설정 과정에서 숙련된 개발자를 위한 고급 기능의 활용에 이르기까지 다양한 데모를 제공한다.

제품 및 기술 얻기

  • Android용 Facebook SDK(현재 릴리스는 Alpha): 이 라이브러리를 통해 Facebook을 Android 모바일 애플리케이션에 통합해 보자.

  • Facebook Platform: Facebook과 웹에서 소셜 애플리케이션을 빌드하는 기능을 확장해 보자.

  • Facebook Old REST API(Graph API의 이전 버전): 단순 HTTP 요청을 통해 프로그래밍 방식으로 Facebook 웹 사이트와 상호작용해 보자.

  • Facebook Graph API(현재 버전): 이 핵심 Facebook Platform API에 대해 살펴보자.

  • OAuth 2.0 Protocol 스펙(2010년 7월): Facebook Platform에서 지원하는 OAuth 인증에 대해 작업해 보자.

  • Android SDK: 공식 Android 개발자 사이트에서 SDK를 다운로드하고 API 참조에 액세스하고 Android 관련 최신 뉴스를 확인해 보자. 1.5 이상의 버전을 사용할 수 있다.

  • Android Open Source Project: Android 호환 디바이스를 빌드하기 위해 필요한 오픈 소스 정보 및 소스 코드를 찾아보자.

  • JDK 6 Update 21: Java Platform, Standard Edition을 얻을 수 있다.

  • Eclipse: 최신 Eclipse IDE를 다운로드하자.

  • Android용 Facebook SDK: Android용 Facebook SDK의 현재 Alpha 릴리스를 받자.

  • IBM 제품 평가판: IBM SQA Sandbox의 온라인 시험판을 다운로드하거나 살펴보고 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.

토론

  • XML 영역 토론 포럼: 여러 XML 관련 토론에 참여해 볼 수 있다.

  • developerWorks 커뮤니티: 개발자가 운영하고 있는 블로그, 포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

필자소개

C. Enrique Ortiz는 오랜 기간 동안 모바일 기술자이자 개발자이자 저자로서 일해 왔다. 블로그 주소는 About Mobility이며 Austin chapter of MobileMonday의 설립자이다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=XML, 오픈 소스
ArticleID=643619
ArticleTitle=Facebook API 소개
publish-date=12162010
author1-email=enrique.ortiz@gmail.com
author1-email-cc=nancy_hannigan@us.ibm.com

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.