본문 바로가기

Daily Sample

[Day25] FaceBook API 로 연동되는 Androday FaceBook App 소스

TITLE : Androday FaceBook App 
Date : 2011/06/17 
Description : 
This is Source that Androday FaceBook App by FaceBook API
Download Link :  
(본 소스는 FaceBook 회사 소유의 오픈소스 가 첨부되 있습니다 )
 
FaceBook 연동은 Twtter와 동일한 OAuth 연동을 지원한다 
차이점은 별도로 지원하는 라이브러리가 없고 , 공식사이트에서 연동소스를 오픈해서 제공한다
트위터 연동에서 AsyncTask를 이용한 CallBack 방식을 이용했다면 , FaceBook 연동 소스에서는 Thraed 와 리스너를 사용해 CallBack 을 구현하였다 
AsyncTask와 Thread 의 차이점은 거의 없지만 , 이번 예제에서는 결과값을 Handler가 아닌 Listner 를 사용한다는 점에서 차이가 있다
Listner는 UI 쓰레드에서 실행된다는 보장이 없기때문에 반드시 결과값은 RunOnUiThread() 로 실행해 준다
 
1. Auth 버튼을 누룰경우 FaceBook API에서 제공하는 LoginButton가 실행되서 인증페이지가 시작된다
/*
  * 소스에 첨부된 APP_ID의 경우 Androday app의 것이기때문에 반드시 본인의 것으로 변경
*/ 
 new Facebook(APP_ID);
  mFb.authorize(mActivity, mPermissions, new LoginDialogListener());

        
2. 인증 과정이 정상적으로 실행되면 onActivityResult가 실행되어 FaceBook객체에 대한 토큰이 저장되며,
토큰 저장 성공 시 SampleAuthListener리스너가 호출되서 로그인 성공을 알린다
 public class SampleAuthListener implements AuthListener {
  public void onAuthSucceed() {
   Toast.makeText(MainActivity.this, “You have logged in! “, Toast.LENGTH_SHORT).show();
  }
  public void onAuthFail(String error) {
   Toast.makeText(MainActivity.this, “Login Failed: “, Toast.LENGTH_SHORT).show();
  }
 }
 
 
 3. 인증 성공 시에 토크값을 SessionStore라는 정적클래스를 이용해서 저장하여 다음번 실행시 부터는 인증없이 세션만 불러오면 된다
(트위터연동과 다른데 어파치 토크값을 저장한다는 점에서 맥락은 동일하지만,  웹 API 라서 그런지 세션이라고 표현한 점이 참신하다)
  
  SessionEvents.addAuthListener(new SampleAuthListener());
  SessionEvents.addLogoutListener(new SampleLogoutListener());  
  SessionStore.restore(mFacebook, this);

  
4. 세션이 살아있는 상태에서 글쓰기 버튼을 누르면 RequestFaceBook()가 실행되어 FaceBook 서버에 Request를 요청한다
mAsyncRunner 클래스는 FaceBook객체를 비동기적으로 사용하기위한  Thread 클래스이며, 처리결과는 SampleRequestListener 리스너로 반영된다
 
 public void RequestFaceBook() {
  dialog = new ProgressDialog(MainActivity.this);
  dialog.setMessage(“Request to FaceBook . . .”);
  dialog.show();
  mAsyncRunner.request(“me”, new SampleRequestListener());
 } 

  
5. FaceBook 서버에서 정상적으로 SampleRequestListener 리스너로 Reqest에 응답이 오면 FaceBook Graph API를 이용해서 글쓰기를 한다
(리스너 결과값을 UiThread 에 반영하기 위해서는 반드시 RunOnUiThread 을 통해서 실행한다)
  
 public void postWallFaceBook(String id, String comment) {  
  dialog = new ProgressDialog(MainActivity.this);
  dialog.setMessage(“Writing a comment . . .”);
  dialog.show();
  Bundle parameters = new Bundle();
  parameters.putString(“message”, comment);
  mAsyncRunner.request(id + “/feed”, parameters, “POST”, new WallPostRequestListener(), null);
 }

 
6. FaceBook 서버에서 응답이 오면 WallPostRequestListener 리스너로 Response가 오며,  글쓰기 성공 시 Response에 message가 전달된다
if (message != null) {
    MainAct.ivity.this.runOnUiThread(new Runnable() {
     public void run() {
      Toast.makeText(MainActivity.this, “글쓰기 성공!”, Toast.LENGTH_SHORT).show();
     }
    });
   } else {
    MainActivity.this.runOnUiThread(new Runnable() {
     public void run() {
      Toast.makeText(MainActivity.this, “글쓰기 실패!”, Toast.LENGTH_SHORT).show();
     }
    });

   
<P.S> 소스에 첨부된 APP_ID 는 언제든지 삭제될수 있으므로, 본인의 인증키를 발급 받도록 한다. 
 
트위터와 동일한 OAuth 인증이지만, 리스너를 적극적으로 활용한다는 점에서 연동방식에 차이점이 있다
또한 FaceBook서비스의 기능이 다양하기 때문에 (담벼락쓰기, 친구글쓰기, 추천하기, 이미지 업로드 등) 
좀더 다양한 기능에 대해서는 Graph API 와 오픈소스 에 대한 분석이 필요하다.
 
 Creative Commons License
이 저작물은 크리에이티브 커먼즈 저작자표시 3.0 Unported 라이선스에 따라 이용할 수 있습니다.