티스토리 뷰

728x90

Twitter 접속 API 부분이 변경되면 아래 소스코드를 사용할 수 없습니다. 글 작성 당시에는 아래 방법을 활용하였습니다.

Twitter oAuth를 사용하여 로그인 하는 소스코드입니다. oAuth를 사용하기위해서 signpost-commonsHttp.jar과 signpost-core.jar 파일을 사용합니다.(이게 없다면 직접 짜셔야 합니다.)
로그인 순서는
1. activity로 로그인 처리 합니다.
2. start함수를 이용하여 토큰값이 저장되어 있는지 빈공간인지 처리합니다.
3. 값이 null이라면 signpost를 사용하여 oAuth로그인 처리합니다.
4. 로그인이 완료되어 돌아오면 값을
SharedPreference 에 복사해 둡니다.
5. 이후 페이지는 SharedPreference에 저장된 값을 사용하여 트위터를 제작하시면 됩니다.
- 일부분의 소스코드입니다. 단순 참고용으로 사용하세요.

void Start() 
	//1.SharedPreferencep AccessToke이 있으면 그거 사용.
	//2.AccessToken이 Expire을 쓸수 있는지 트위터에 확인.
	SharedPreference sh = new SharedPreference(Authorize.this);
	String token = sh.getPrefrence(StaticFinal.ACCESSTOKEN);
	String tokenSecret = sh.getPrefrence(StaticFinal.ACCESSTOKENSECRET);
	if(token != null || tokenSecret != null) {
		//Token 값을 넘겨서 TwitterApi를 생성합니다.
		TwitterApi api = new TwitterApi(token, tokenSecret);
		//접속자 정보를 가지고 옵니다. 사용자 정보가 null이 아닐때만 가지고 옵니다.
		User user = api.verifyCredentials();
		if(user != null) {
			//user정보가 null이 아니라면 트위터를 시작합니다.
			Intent intent = new Intent(Authorize.this, TwitterActivity.class);
			intent.putExtra(StaticFinal.USERNAME, user.screen_name);
			intent.putExtra(StaticFinal.PROFILEIMAGEURL, user.profile_image_url);
 
			startActivity(intent);
		return ;
		}
	}
	//3.AccessToken이 없거나, 쓸 수 없는 상태면 OAuth 인증과정 진행.
	startOauth();
}
//oAuth를 사용하여 트위터를 로그인 하기 위한 소스코드입니다.

void startOauth() {
	Log.d("TA", "startOauth");

	/*oAuth를 사용하여 로그인 하기위해서는 아래와 같은 함수가 필요합니다.
	   (구글에서 제공되는 oAuth 로그인 방식을 사용하면 아래와 같이 처리할 수 있습니다.
	   첨부파일 참조하세요.
	   첨부파일은 자기자신의 프로젝트 아래 jar폴더 아래에 복사해두면 됩니다. signpost-commonshttp4-1.2.1.1.jar, signpost-core-1.2.1.1.jar) */
	mConsumer = new CommonsHttpOAuthConsumer(TwitterApi.CONSUMER_KEY,  TwitterApi.CONSUMER_SECRET);
	mProvider = new CommonsHttpOAuthProvider(TwitterApi.REQUEST_TOKEN_URL,
	TwitterApi.ACCESS_TOKEN_URL, TwitterApi.AUTHORIZE_URL); 
	try {
		//위에서 생성한 mConsumer과 CALLBACK_URL을 RetrieveRequestToken 함수에 넘겨줍니다.
		String authUrl = mProvider.retrieveRequestToken(mConsumer,  TwitterApi.CALLBACK_URL);
		//intent를 사용합니다.
		Intent intent = new Intent(Authorize.this, WebActivity.class);
		intent.putExtra(StaticFinal.AUTHURL, authUrl);
		startActivity(intent);
	} catch (OAuthException e) {
		// TODO: handle exception
		Log.e("Twitter", "OAuthException : " + e.getMessage());
	}
}

//로그인이 완료되면 onNewIntent라는 함수로 돌아 옵니다.

@Override
protected void onNewIntent(Intent intent) {
	Log.d("TA", "onNewIntent");
	// TODO Auto-generated method stub
	Uri uri = intent.getData();
	try {
		//값이 callback_url로부터 온건지 확인을 합니다.
		if(uri != null && uri.toString().startsWith(TwitterApi.CALLBACK_URL)) {
		//twitter에서 로그인 처리하면 oauth_verifier로 쿼리가 넘오옵니다. 그값을 복사합니다.
		String verifier = uri.getQueryParameter("oauth_verifier");

		//첨부파일의 signpost에서 자동으로 처리해서 값을 넘겨줍니다.
		mProvider.retrieveAccessToken(mConsumer, verifier);

		//토큰 값과 토큰 시크릿 값을 받아 옵니다.
		String accessToken = mConsumer.getToken();
		String accessTokenSecret = mConsumer.getTokenSecret();

		//SharedPreference에 AccessToken, Secret 저장합니다.
             	SharedPreference sh = new SharedPreference(this);
		sh.setPreference(StaticFinal.ACCESSTOKEN, accessToken);
             	sh.setPreference(StaticFinal.ACCESSTOKENSECRET, accessTokenSecret);
             	//위의 start함수를 다시 호출하고 트위터 페이지로 넘어가게 됩니다.
             	Start();
           	}
	} catch(OAuthException e) {
        	Log.e("Twitter", "OAuthException" + e.getMessage());
      	}
}

Twitter Api입니다. 로그인시 생성된 토큰과 시크릿 토큰키값을 확인하기위한 class입니다.

public class TwitterApi {
	Context context;
	public static final String CONSUMER_KEY = "api에서 제공된 CONSUME_KEY를 입력합니다.";
     	public static final String CONSUMER_SECRET = "api에서 제공된 CONSUMER_SECRET를 입력합니다.";
    	public static final String CALLBACK_URL = "twit://api 등록시 작성한 CALLBACK_URL을 입력합니다.";
     
     	public static final String REQUEST_TOKEN_URL = "https://api.twitter.com/oauth/request_token";
     	public static final String ACCESS_TOKEN_URL = "https://api.twitter.com/oauth/access_token";
     	public static final String AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize";
     
     	CommonsHttpOAuthConsumer mConsumer;

       	//Twitter에서 제공된 키값을 복사하고 생성자를 만듭니다.
     	TwitterApi(String token, String tokenSecret) {
         	mConsumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
         	mConsumer.setTokenWithSecret(token, tokenSecret);
	}
}

//생성된 키값이 정상인지 확인하거나 생성되어 있는지 확인합니다.

User verifyCredentials() {
	User user = new User();
	final Parser p = new Parser();
	HttpClient httpclient = new DefaultHttpClient();

	HttpGet get = new HttpGet("http://api.twitter.com/1/account/verify_credentials.xml");
         
	try {
             	mConsumer.sign(get);
             	HttpResponse response = httpclient.execute(get);
             	response.getStatusLine().getStatusCode();
             
             	int statusCode = response.getStatusLine().getStatusCode();
             	//정상일 경우 아래 코드가 실행 됩니다.
             	if(statusCode == 200) {
			HttpEntity entity = response.getEntity();
                 	InputStream is = entity.getContent();
                 
                 	//Parser (여기서 Parser은 사용자 정보를 받아오기 위해서 사용한 파서입니다.)
                 	XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                 	XmlPullParser xpp = factory.newPullParser();
                 	xpp.setInput(is, "UTF-8");
                 
                 	user = p.parseUser(xpp);
                 
                 	is.close();
		return user;
		//에러 처리부분입니다.
		} else {
                 	InputStream is = response.getEntity().getContent();
                 	BufferedReader br = new BufferedReader(new InputStreamReader(is));
                 	String s;
                 	Log.d("Twitter", "Api Response : " + statusCode);
                 	while((s = br.readLine()) != null) {
                     		Log.d("Twitter", s);
                 	}
                 	br.close();
                 	return null;
             	}
	} catch (ClientProtocolException e) {
             	// TODO Auto-generated catch block
             	e.printStackTrace();
        } catch (IOException e) {
            	// TODO Auto-generated catch block
             	e.printStackTrace();
        } catch (XmlPullParserException e) {
             	// TODO Auto-generated catch block
             	e.printStackTrace();
        } catch (OAuthMessageSignerException e) {
             	// TODO Auto-generated catch block
             	e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            	// TODO Auto-generated catch block
             	e.printStackTrace();
         } catch (OAuthCommunicationException e) {
             	// TODO Auto-generated catch block
            	e.printStackTrace();
        } finally {
	}
        
        return user;
    	}
}

//xml 처리부분입니다. 아래와 같이 해야 로그인 처리를 할 수 있습니다. //scheme에는 http를 넣으면 됩니다.(twit를 넣은 이유는 twitter로그인시 처리가 안 될 경우가 발생하기 때문에 임의로 사용했습니다.)



   
   
   
   




댓글