티스토리 뷰
페이스북 연동하여 글 가져오기
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);
/**
* 만약, Message가 null 이 아니라면 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;
}
/**
* ListView에 Item을 셋팅함
* @param position : 현재 보여질 Item의 Index , 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;
}
}
'Android' 카테고리의 다른 글
[Android] Jsoup 으로 HTML 파싱하기 (7) | 2016.08.09 |
---|---|
[Android] 페이스북 타임라인에 포스팅하기, 글 검색하기 (0) | 2016.08.08 |
[Android] Android Landscape (가로모드) (1) | 2016.08.05 |
[Android] Android SQLite (0) | 2016.08.04 |
[Android] Fragment 예제 (PagerSlidingTabStrip , TabLayout ) (4) | 2016.08.03 |
- Total
- Today
- Yesterday
- list
- Spring
- 예외처리
- servlet
- controller
- DFS
- onBackPressed
- INSERT
- boj
- table
- order by
- AlertDialog.Builder
- 이클립스
- maven
- mybatis
- Baekjoon Online Judege
- DP
- onPostExecute
- jsp
- 안드로이드 스튜디오
- algorithm
- 자바
- RequestMapping
- REDIRECT
- indexOf
- restfb
- sort
- 안드로이드 비콘
- BFS
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |