Getting Started with the Facebook SDK for Android


원문 링크 : https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/









 6. Create a new Android Project with Facebook Login

 Create a new project, link to the Facebook SDK; demonstrate Facebook Login and fetch the user's name


이 스텝에서는 새로운 안드로이드 프로젝트를 만들고, Facebook SDK 를 사용해, facebook 앱을 통해 로그인 하는 과정을 진행합니다.



우선 프로젝트를 새로 만들어줍니다. 물론 안드로이드 프로젝트로요.




액티비티도 하나 만들어줍니다.




이제 다시 Developer site 로 갑니다. [Apps] 에서 [5] 스텝에서 만들었던, test app 에 정보를 추가할거에요.

방금 만든 프로젝트의 패키지, 액티비티의 정보를 입력해줍니다.





이번엔, 방금 만든 테스트 앱과 Facebook SDK 를 연결시켜줄거에요.

프로젝트의 [Properties] > [Android] 로 가서, Library 섹션의 [Add] 버튼을 눌러주세요.

그리고 아래 스크린 샷 처럼 FacebookSDK 를 추가해줍니다.





이번엔 res/values 에 있는 strings.xml 에 app id 를 추가해줍니다.

app id 는 [5] 스텝에서 Facebook developer site 에 등록한 앱 정보에서 확인할 수 있습니다.




이 app id 를 복사해 와서 strings.xml 에 추가를 해줍니다.




그리고 AndroidManifest.xml 의 meta 정보에 추가를 해줘야해요.

meta data 의 이름은 com.facebook.sdk.ApplicationId 로 해주고, value 에 @string/app_id 를 설정해줍니다.




AndroidManifest.xml 에 Facebook SDK 에 있는 LoginActivity 도 추가해줍니다.

클래스를 생성할 필요는 없고 가져다 쓰기만 할거라서 Manifest 에만 추가를 해주면 되요.



그리고 AndroidManifest.xml 의 퍼미션에 Internet 도 추가를 해줘야해요. 당연한 얘기지만 인터넷이 안되있으면, network communicate 를 못하는..


살짝 정리해보면... 이렇게 추가를 했어요.

 res/values/strings.xml

 - <string name="app_id">409663295782902</string>


 AndroidManifest.xml

 - <uses-permission android:name="android.permission.INTERNET"/>

 -  <meta-data
      android:name="com.facebook.sdk.ApplicationId" 

      android:value="@string/app_id"/>

 - <activity android:name="com.facebook.LoginActivity"/>








로그인이 제대로 되었는지를 출력하기 위해, TextView 에 id 를 지정해줍니다.

...
<TextView
    android:id="@+id/welcome"
    android:layout_width="wrap_content"
    ...


이제 MainActivity.java 에 코딩을 할 차례입니다.

실제 원문에서는 아래의 패키지나 클래스들을 import 하라고 나오는데... Command + Shift + O 로 해결하도록 하죠^^;

import com.facebook.*;
import com.facebook.model.*;

import android.widget.TextView;
import android.content.Intent;



Facebook 앱을 실행시키고 데이터를 받아올 것이므로, onActivityResult 메소드를 구현해줍니다.

이렇게 설명되어있네요.


Facebook SDK 의 중요한 부분은 Session 클래스입니다. Session 클래스는 사용자를 인증하고 권한을 부여의 과정을 관리합니다. 


사용자에게 권한을 확인하고 앱을 전환하고 다시 이 액티비티로 돌아와서 active session 을 업데이트 할 수 있도록 onActivityResult 를 구현해주는거죠.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}

(Session 및 Activity life cycle에 대한 포괄적인 구현은 sample app 에 되어있고, 설명은 Facebook Login guide 에 있습니다. 예를들어 당신이 캐싱 토큰, session resuming 같은 이점을 원한다면 말이죠.)



MainActivity 의 onCreate 메소드 끝 부분에, Session.openActiveSession 메소드를 추가합니다.

이 태스크는 세가지 argument 가 필요해요.

- Activity activity : 해당 Activity 에 대한 referenece

- boolean allowLoginUI : 로그인 UI 를 사용할것인지에 대한 플래그.

- SessionStatusCallback callback : 상태 변경이 일어나면 호출될 callback

(더 강력한 구현은 named instance 로 콜백을 만들 필요가 있지만, 이건 샘플앱이니 anonymous instance 를 사용합니다.)

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  // start Facebook Login
  Session.openActiveSession(this, true, new Session.StatusCallback() {

    // callback when session changes state
    @Override
    public void call(Session session, SessionState state, Exception exception) {

    }
  });
}

callback 의 call 메소드는 여러번 호출 될 가능성이 있습니다. SessionState 가 그대로 넘어오고 있는 것을 보면 당연한거겠죠? (예를들어, session 이 OPENED 일때, OPENING 일때 등등..)

여기서는 사용자의 이름을 가져와서 환영 메시지를 업데이트 하고 싶은거죠.

그래서 call 메소드 안에서 세션이 열려있는지만 확인을 해봅니다.

if (session.isOpened()) {
}

이제 이 if 문 안에, Facebook Graph API 의 /me endpoint 에 리퀘스트를 만들고 유저 기본정보를 가져와 fetch 합니다.

Request 클래스는 executeMeRequestAsync 같은 common 한 요청을 만들고 실행하기 위한 편리한 몇가지 메소드를 제공합니다. executeMeRequestAsync 같은 메소드는 session 을 reference 로 가지고 있고, API call 이 완료 됐을 때에 대한 처리를 하기 위해, 우리가 작성한 코드가 담긴 다른 callback (반환될 사용자 데이터에 대한 strong-type의 콜백, 여기서는 Request.GraphUserCallback) 을 포함합니다.

// make request to the /me API
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

  // callback after Graph API response with user object
  @Override
  public void onCompleted(GraphUser user, Response response) {
  }
});

또다시, 이 콜백의 onComplete 메소드 안에, TextView label 을 user's name 으로 바꿔줄 간단한 코드를 작성해야죠.

if (user != null) {
  TextView welcome = (TextView) findViewById(R.id.welcome);
  welcome.setText("Hello " + user.getName() + "!");
}


이제 수정한 파일들을 저장하고, emulator 에 애플리케이션을 올려서 실행해봅니다.


만약 페이스북 앱에 로그인이 되어있다면, 즉시 Facebook login flow 가 시작될 거구요. 성공적으로 로그인을 하겠죠.





페이스북 앱에 로그인이 안되어있으면, 아래와 같이 페이스북 앱으로 전환 된 후, 로그인을 해줘야 할 거구요.




페이스북 앱이 설치되어 있지 않은 경우라면, modal web view dialog 를 사용합니다.




자 어쨋든! 이제 로그인 해서 기본정보(여기선 이름을 불러왔었죠.)를 불러오는 것까지 해보았습니다.

예전보다 한층 친절해진 페이스북 형들덕에 쉽게 할 수 있었네요. 


아래는 Getting Started 에 있는 샘플 코드 중 MainActivity 의 코드입니다.

package com.firstandroidapp;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.widget.TextView;
import com.facebook.*;
import com.facebook.model.*;

public class MainActivity extends Activity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // start Facebook Login
    Session.openActiveSession(this, true, new Session.StatusCallback() {

      // callback when session changes state
      @Override
      public void call(Session session, SessionState state, Exception exception) {
        if (session.isOpened()) {

          // make request to the /me API
          Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

            // callback after Graph API response with user object
            @Override
            public void onCompleted(GraphUser user, Response response) {
              if (user != null) {
                TextView welcome = (TextView) findViewById(R.id.welcome);
                welcome.setText("Hello " + user.getName() + "!");
              }
            }
          });
        }
      }
    });
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
  }

}




작성한 프로젝트 + FacebookSDK 프로젝트 +  Facebook 2.0.apk


CrouteTestApp FacebookSDK.zip








 7. Start Coding!

 That's it... now go and enhance one of the sample apps, work through the Scruptious Tutorial, and get creative



이제 Getting Started 는 끝났구요. 코딩을 시작하면 됩니다.

스텝 7에는 이렇게 되어있군요. 


이게 전부고, Scruptious tutorial 을 통해 샘플을 강화해보고, 창의력을 발휘하라고...

어쨋든 Facebook SDK 3.0 for Android 의 Getting Started 는 끝났습니다~ 짝짝짝.




Posted by croute

댓글을 달아 주세요

  1. 케로케로 2013.01.29 19:22  댓글주소  수정/삭제  댓글쓰기

    글 잘봤습니다~
    하나 궁금해서 그러는데요 페이스북 어플이 없을때는 괜찮은데 혹시 페이스북어플이 핸펀에 깔려있을때 StatusCallback 에서 앱 승인 이후 OPENING 한번 들어오고 OPENED는 들어오지 않던데.. 혹시 이같은현상 왜그러는지 알 수 있을까요?

  2. BlogIcon 장승제 2013.02.28 11:11  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 C라우트님 제가 페이스북 SDK 3.0 적용을 하다가 문제가 생겼는데...
    1. 페이스북앱이 깔려있고 로그인이 되어있을 때 또는
    2. 페이스북앱이 로그인이 되어있지 않아서 로그인 화면이 뜬 후 로그인 성공 및 연동 후
    요 두가지 케이스에서 다시 저의 앱으로 돌아왔을때 session.isOpened() 가 false가 떨어지는데..
    무엇이 문제일까요 ㅠ C라우트님은 이런 현상이 없나요..?