티스토리 뷰

페이스북 연동하여 글 가져오기


facebook 개발자 앱 등록하기

먼저 https://developers.facebook.com/apps 에 접속하여 앱을 등록하고 App ID 와 시크릿 코드를 발급 받는다.


또한 필요한 것은 액세스 토큰이다. 


도구 및 지원 탭에 들어가 액세스 토큰을 복사해 놓는다.

액세스 토큰은 사용자의 정보에 접근을 가능하게 해주는 것이다.  ( 시간이 지나면 자동으로 새로운 토큰이 갱신된다. )


https://developers.facebook.com/apps 에서 앱ID, 앱 시크릿 코드, 액세스 토큰 3가지를 복사해 두고 


안드로이드 프로젝트를 생성한다.


restfb 라이브러리 다운


페이스북 예제를 하면서 사용할 Java Library 는 restfb이다. 

http://restfb.com/ 에 접속하여 라이브러리를 다운받아 프로젝트 안에 넣는다.


Download from Github 를 클릭하여 압출파일을 다운받고


압축을 풀어 restfb-1.29.0.jar 파일을 복사한다.


프로젝트의 app - libs 폴더에 붙여넣기한뒤 프로젝트를 다시 Rebuild 해준다.





안드로이드 버전 낮추기


Gradle Scripts 에서 build.gradle 에 들어가 

기존에 23이었던 버전을 21로 낮춘다.


apply plugin: 'com.android.application'

android {
compileSdkVersion 21
buildToolsVersion "23.0.3"

defaultConfig {
applicationId "com.ktds.jmj.customlistview"
minSdkVersion 16
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:21.0.0'
}


변경한 뒤 Sync Now를 해준다.


인터넷 권한 획득


AndroidMenifest.xml 에 인터넷 권한을 위한 코드를 추가한다.

 

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


페이스북 클래스 생성

페이스북 클래스를 만들어 아까 복사해둔 APP_ID, APP_SECRET, ACCESS_TOKEN 을 입력한다.


public class Facebook {

/**
* 인증과 관련된 상수들
*/
private static final String APP_ID = "";
private static final String APP_SECRET = "";
private static final String ACCESS_TOKEN = "";

}


그리고 페이스북 context를 받아오는 객체를 생성한다.

private Context context;

public Facebook(Context context) {
this.context = context;
}


인증을 위한 객체와 로그인이 되었는지 확인하는 변수 또한 생성한다.

/**
* Facebook 인증 객체
*/
private FacebookClient myFacebook;

private boolean isLogin;



/**
* Facebook 으로 로그인 한다.
* @return : 로그인 성공시 true
*/
public void auth() {

new Thread(new Runnable() {
@Override
public void run() {
//Facebook 로그인
myFacebook = new DefaultFacebookClient(ACCESS_TOKEN, Version.LATEST);

// 로그인이 성공했는지 체크한다.
// 로그인된 계정의 정보를 가져온다.
User me = myFacebook.fetchObject("me", User.class);

Log.d("FACEBOOK", me.getName() + " 계정으로 로그인 함.");

isLogin = me != null;


}
}).start();

}

public boolean isLogin() {
return isLogin;
}


타임라인에서 글을 가져오기 위한 코드도 생성했다.


public void getTimeLine( final TimelineSerializable timelineSerializable ) {
new Thread(new Runnable() {
@Override
public void run() {
// 나의 타임라인에서 포스트들을 가져온다.
Connection<Post> feeds = myFacebook.fetchConnection("me/feed", Post.class, Parameter.with("fields", "id,from,likes,message,story,link"));

List<Post> postList = new ArrayList<Post>();
// 타임라인 정보들...
for (List<Post> posts: feeds ) {
postList.addAll(posts);

}
timelineSerializable.serialize(postList);

}
}).start();

}

public interface TimelineSerializable {

public void serialize(List<Post> posts);
}



메인 액티비티 코드 작성

메인액티비티에서는 페이스북의 타임라인을 가져와 리스트뷰로 보여준다.

package com.ktds.jmj.customlistview;

import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.ktds.jmj.customlistview.facebook.Facebook;
import com.restfb.types.Post;

import java.util.List;

public class MainActivity extends ActionBarActivity {

private ListView lvArticleList;
private Facebook facebook;
private Handler handler;

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

handler = new Handler();

lvArticleList = (ListView) findViewById(R.id.lvArticleListView);

facebook = new Facebook(this);
facebook.auth();


}



public void setTimeLine() {
if( facebook.isLogin() ){
// .... timeLine 가져오기
facebook.getTimeLine(new Facebook.TimelineSerializable() {
@Override
public void serialize(final List<Post> posts) {

handler.post(new Runnable() {
@Override
public void run() {
lvArticleList.setAdapter(new ArticleListViewAdapter(MainActivity.this, posts));

}
})
;
}
})
;
}
}

private class ArticleListViewAdapter extends BaseAdapter {

/**
* ListView Item을 셋팅할 요청자의 객체가 들어감.
*/
private Context context;

private Post article;
/**
* ListView에 셋팅할 Item 정보들.
*/
private List<Post> articleList;

public ArticleListViewAdapter(Context context, List<Post> articleList) {
this.context = context;
this.articleList = articleList;
}

/**
* 아이템의 속성에 따라서 보여질 Item Layout을 정해준다.
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
// return super.getItemViewType(position);

/**
* 만약, Messagenull 이 아니라면 list_item_message 를 보여주고,
* Story null 이 아니라면 list_item_story 를 보여주고,
* link null 이 아니라면 list_item_link 를 보여준다.
*/
article = (Post) getItem(position);
if ( article.getMessage() != null && article.getMessage().length() > 0 ){
return 0;
}
else if ( article.getStory() != null && article.getStory().length() > 0 ){
return 1;
}
else if ( article.getLink() != null && article.getLink().length() > 0 ){
return 2;
}

return 0;
}

public int getLayoutType( int index ){
if ( index == 0 ) {
return R.layout.list_item_message;
}
else if ( index == 1 ) {
return R.layout.list_item_story;
}
else if ( index == 2 ){
return R.layout.list_item_link;
}

return -1;
}

/**
* Item Layout 의 개수를 정한다.
* @return
*/
@Override
public int getViewTypeCount() {
return 3;
}

/**
* ListView에 셋팅할 아이템들의 수
* @return
*/
@Override
public int getCount() {
return this.articleList.size();
}

/**
* position 번째 Item 정보를 가져옴.
* @param position
* @return
*/
@Override
public Object getItem(int position) {
return this.articleList.get(position);
}

/**
* Item Index를 가져옴
* Item Index == position
* @param position
* @return
*/
@Override
public long getItemId(int position) {
return position;
}

/**
* ListViewItem을 셋팅함
* @param position : 현재 보여질 ItemIndex , 0부터 getCount() 까지 증가함
* @param convertView : ListView Item Cell 객체를 가져옴.
* @param parent : ListView
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {


ItemHolder holder = null;
int layoutType = getItemViewType(position);


//가장 효율적인 방법
if (convertView == null) {

// Item Cell Layout을 적용시킬 Inflater 객체
LayoutInflater inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);

// Item Cell Layout을 적용시킨다.
// false는 덮어쓸것이냐 말것이냐 대부분 false 를 쓴다.
convertView = inflater.inflate(getLayoutType(layoutType), parent, false);

holder = new ItemHolder();

if( layoutType == 0 ) {
holder.tvSubject = (TextView) convertView.findViewById(R.id.tvSubject);
holder.tvAuthor = (TextView) convertView.findViewById(R.id.tvAuthor);
holder.tvHitCount = (TextView) convertView.findViewById(R.id.tvHitCount);
}
else if( layoutType == 1 ) {
holder.tvSubject = (TextView) convertView.findViewById(R.id.tvSubject);
}
else if( layoutType == 2 ){
holder.tvSubject = (TextView) convertView.findViewById(R.id.tvSubject);
}
convertView.setTag(
holder);

}
else {
holder = (ItemHolder) convertView.getTag();
}


article = (Post) getItem(position);

if( layoutType == 0 ){
holder.tvSubject.setText(article.getMessage());
holder.tvAuthor.setText(article.getFrom().getName());

if ( article.getLikes() == null )
holder.tvHitCount.setText("0");
else
holder.tvHitCount.setText(article.getLikes().getData().size() + "");
}
else if ( layoutType == 1 ){
holder.tvSubject.setText(article.getStory());
}
else if ( layoutType == 2 ){
holder.tvSubject.setText(article.getLink());
holder.tvSubject.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent =
new Intent ( Intent.ACTION_VIEW, Uri.parse(article.getLink()));
startActivity(intent);
}
})
;
}


return convertView;
}
}

private class ItemHolder {

public TextView tvSubject;
public TextView tvAuthor;
public TextView tvHitCount;
}
}



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함