IT_Programming/Android_Java

[펌] 안드로이드 App과 Twitter API 연동하기

JJun ™ 2011. 7. 1. 17:08

-----------------------------------------------------------------------------------------------

 출처: http://test.androday.com:7788/blog/?p=529

-----------------------------------------------------------------------------------------------

 

TITLE : Androday Twitter App 

Date : 2011/06/01 

Description : This is Source that Androday twitter App by Authorized by Asyntask

Download Link : TwitterApp 

Reference Site : http://tigerwoods.tistory.com/28 , http://taehoonkoo.tistory.com/entry/Android-Twitter-OAuth-PinCode

 

 

 과거에 트위터API가 XML,Json, OAuth등 다양한 인증을 제공했었다.

하지만,  최근 트위터 API를 악용하는 경우가 많아서 직접 인증페이지에 접근해서 토큰을 가져오게
강제하였다.

 

 이렇게 변경되면서 보안은 강화되었지만, 연동방식이 2번의 CallBack 구조로 바뀌었기 때문에
연동하기 무척 복잡해졌다.

 

 이번에 프로젝트를 진행하면서 트위터 토큰을 StartActivityForResult의 결과값으로  구현하여 사용하기

용이하게 하였는데 여기서 소개한다. (설명이 읽기 귀찮다면 트위터 클래스만 복사해서 써도 무방하다.)

 

 네트워크의 CallBack은 쓰레드와 헨들러로 구현해도 되지만, Asynctask로 간단하게 구현해 보았다.

AsyncTask는 말그대로 쓰레드로 처리하는 비동기작업을 수행하기 위한 최적의 클래스다.

 

 

- AsyncTask는 비동기작업이기 때문에  UI 변경 시  Handler / onPreExecute / onPostExecute 등

  핸들메세지를 통해서 UI에 반영한다.

 

 

아이러니 하게도 이 강좌에서 AsyncTask는 동기적으로 작동한다.

(다만, 네트워크 CallBack 구조를 위한 다이얼로그 처리를 위해서 썻다.)  

 

 Twitter연동을 위해서 총 3개의 AsyncTask 클래스를 소개하면 다음과 같다.

 

 RequestTokenAsyncTask.class – 트위터 인증페이지와 PinCode를 가져오기 위한 사전 네트워크

                                                         처리 (CallBack구조)

 

 OAuthTokenAsyncTask.class – 트위터 글쓰기를 위한 token 과 tokenSecret를 가져오기 위한 사전

                                                      네트워크 처리 (CallBack구조)

 

 

RegistAsyncTask.class – token 과 tokenSecret 으로 글을 쓴다. 에러날 경우 글쓰기 실패.

 

 

 

1. Auth 버튼을 누룰경우 startActivityForResult로 TwitterActivity를 시작하면

    RequestTokenAsyncTask로 비동기 작업을 시작하고 결과값은 mHandler로 반환된다.

     (Consumer key 와 Consumer secret 은 본인의 APP으로 인증 받는다.) 

 

 // Consumer key
  String consumerKey = STATICVALUES.consumerKey;
 // Consumer secret  
  String consumerSecret = STATICVALUES.consumerSecret; 
  
  RequestTokenAsyncTask requestTokenAsyncTask = new RequestTokenAsyncTask(this,twitter,

                                                                                    mHandler);   

  requestTokenAsyncTask.execute(consumerKey,consumerSecret);

 

 

 

2. 인증페이지가 정상적으로 로드되면 Webview에서 onPageStarted()가 호출되고 핀 번호를

    가져오는 자바 스크립트가 실행된다.

 

public void onPageFinished(WebView view, String url) {
   super.onPageFinished(view, url); 
   view.loadUrl(“javascript:window.GETPINNUMBER.showHTML(document.getElementById

                                                                                             (‘oauth_pin’).innerHTML);”);   
  }

 

 

3. 자바 스크립트 수행결과 ‘oauth_pin’ 값이 검출될 경우 OAuthTokenAsyncTask로 

   비동기 작업을 시작하고 결과값은 mHandler로 반환된다.

    (원칙적으로 AsyncTask는 MainUI에서 실행해야 되기 때문에 runOnUiThread로 실행한다.)

 

 runOnUiThread(new Runnable() {
      public void run() {       
       OAuthTokenAsyncTask oAuthTokenAsyncTask = new OAuthTokenAsyncTask

                                                                                (TwitterActivity.this, twitter ,mHandler);        
       oAuthTokenAsyncTask.execute(requestToken.getToken(),requestToken.getTokenSecret(),

                                                       realpin );
      }
     });  

 

 

4. mHandler로 반환된 결과 값이 case 2번일 경우 token, tokenSecret 값과 -1을 반환하고

    TwitterActivity를 종료한다.

 

case 2:        
    accessToken = (AccessToken)msg.obj;         
       Intent intent = getIntent();       
       intent.putExtra(“token”, accessToken.getToken());
       intent.putExtra(“tokenSecret”, accessToken.getTokenSecret());
       intent.putExtra(“nick”, accessToken.getScreenName());                    
       setResult(-1 ,intent);              
       finish();    
    break;

 

 

 

5. 반환된 token, tokenSecret값을 사용해서 RegistAsyncTask를 비동기 작업으로 시작하고

   등록 실패 시 TwitterException이 발생한다.

 

 

<P.S> 소스에 첨부된 Consumer key/Consumer secret 는 언제든지 삭제될수 있으므로,

          본인의 인증키를 발급 받도록 한다. 

 

TwitterApp.zip

 

TwitterApp.zip
0.57MB