SlideShare a Scribd company logo
1 of 65
Download to read offline
行動平台上利用 Facebook API 開
發社群應用程式
kewang
2
FACEBOOK
DOCS
SUCKS!!!
3
Me
●
姓名:王慕羣
●
現職:三竹資訊 研發工程師
●
Android 上架 app : http://bit.ly/18m1gUh
●
GitHub : http://github.com/kewang
4
Agenda
●
基礎 Android 開發
●
簡介 Facebook Platform
●
Facebook for Android 動手做
5
基礎 Android 開發
6
開發事前準備
7
開發事前準備
8
Hello World
9
Hello World 解析 - Main.java
public class Main extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
10
Hello World 解析 - main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
11
Hello World 解析 - strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hello World</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
</resources>
12
Hello World 解析 - AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.helloworld.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
13
Playing
14
基本 widgets
●
ViewGroup :可以包含任意個數的 view
●
TextView :單純顯示文字的 view
●
EditText :可以輸入文字的 view
●
Button :可以按下觸發事件的 view
15
基本 widgets - ViewGroup
●
LinearLayout :將 view 以線性方式排列
– android:orientation="horizontal" :橫式排列
– android:orientation="vertical" :直式排列
●
RelativeLayout :將 view 以相對位置排列
– android:alignParentRight="true" :靠齊上一層的右邊
– android:toRightOf="{view-id}" :放在 {view} 的右邊
– android:layout_above="{view-id}" :放在 {view} 的上面
16
基本 widgets - TextView
●
常用來顯示文字,是大部分顯示用 widget 的
parent class
●
setText :指定文字內容
●
setAllCaps :指定英文字顯示時為大寫
●
setGravity :指定文字對齊方式
●
getText().toString() :傳回所顯示的文字
17
基本 widgets - EditText
●
常用來輸入文字
●
setText :指定文字內容 ( 與 TextView 同 )
●
setHint :指定未輸入文字時的文字框內容
●
addTextChangedListener :利用此方法將所輸入
的文字轉換為另種文字
18
基本 widgets - Button
●
常用來執行動作
●
setText :指定文字內容 ( 與 TextView 同 )
●
setOnClickListener :按下此 widget 時所執行的
動作
19
Playing
20
BaseActivity( 個人偏好寫法 )
public abstract class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutId());
findView();
setView();
setListener();
doExtra();
}
public abstract int getLayoutId();
public abstract void findView();
public abstract void setView();
public abstract void setListener();
public abstract void doExtra();
}
21
BaseActivity
●
getLayoutId :該 Activity 要套用的 layout id
●
findView :找出要運用的 view widgets
●
setView :設定 view 的屬性,如 color,size... 等
●
setListener :設定 view 的事件觸發
●
doExtra :當進入 Activity 時初始化要做的事
22
BaseActivity 範例
public class MainActivity extends BaseActivity {
private EditText edtShow;
private TextView txtShow;
private Button btnShow;
@Override
public int getLayoutId() {
return R.layout.activity_main;
}
@Override
public void findView() {
edtShow = (EditText) findViewById(R.id.edit_show);
txtShow = (TextView) findViewById(R.id.text_show);
btnShow = (Button) findViewById(R.id.button_show);
}
23
BaseActivity 範例
@Override
public void setView() {
edtShow.setHint("可以在這邊輸入文字");
}
@Override
public void setListener() {
btnShow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
txtShow.setText(edtShow.getText().toString());
}
});
}
@Override
public void doExtra() {
Toast.makeText(this, "Initialize", Toast.LENGTH_LONG).show();
}
}
24
Playing
25
Android 開發必讀
● Develop | Android Developers
26
簡介 Facebook Platform
27via http://bit.ly/18m6f7l
28
Facebook Platform
● Open Graph
● Social Plugins
● Graph API
● Dialogs
● Facebook Login
● FQL
● Client SDK
29
Open Graph
●
由 Facebook 發明。
●
建構在現有的網頁技術上面。
●
以語意網 (Semantic Web) 的概念開始。
●
只要在任何一個網頁的 metadata 內加入一些特
定屬性,就可以讓使用者在特定網站 ( 目前大
都為 Facebook) 引用這個網頁時,能收集到使用
者的眾多資訊。
30
Open Graph
31
Playing
32
Open Graph 與隱私權相關討論
● Open Graph Overview
● Facebook Open Graph的 與 平台政策修改 新
聞整理
● Facebook你應該要害怕 嗎?
● Facebook Graph API –新 推出 你打算跟魔鬼做
交易了嗎?
● Facebook社群抓力:你的喜好 都知道
33
Social Plugins
●
不在 Facebook ,也能 Facebook
●
能讓你的朋友在其他網站知道你喜歡什麼、評
論什麼或是分享了什麼
●
包含了 "Like" 、 "Comment" 、 "Share Dialog"...
等眾多的社交功能。
34
Social Plugins - Like
35
Social Plugins - Like
36
Social Plugins - Comments
37
Playing
38
Social Plugins 相關資源
● Like Button
● Comments Box
39
Graph API
●
Facebook 的核心
●
幾乎所有的 Facebook API 都是由此衍生而來
– Open Graph, Social Plugins... 等
– Android, iOS, PHP,JavaScript... 等 client SDK
●
開發必讀
– API References
– Graph API Explorer
40
Graph API
●
包含各種物件: Photo, Link, User,Page, Post... 等
●
以 JSON 格式呈現
●
每個在 Graph 上面的物件都有唯一 id
– 網址: http://graph.facebook.com/{id}
●
User 及 Page 除了唯一 id 外,也有唯一 name
ex.
● http://graph.facebook.com/1440581349
● http://graph.facebook.com/kewangtw
41
Graph API
●
包含一個名為 me 的特殊路徑
– http://graph.facebook.com/me ( 必須先取得 token)
– http://graph.facebook.com/{my-id}
– http://graph.facebook.com/{my-name}
42
Graph API example
● Publishing a post
– curl -F 'access_token=...' -F 'message=Hello. I like this new
API.' https://graph.facebook.com/{user-id}/feed
● Likes and Comments
– curl -F 'access_token=...' https://graph.facebook.com/
{object-id}/likes
– curl -F 'access_token=...' https://graph.facebook.com/
{object-id}/comments
● Facebook APIs › Graph API › Post
43
Graph API Explorer
● Easy to use Graph API
44
Playing
45
Facebook for
Android 動手做
46
Facebook for Android 動手做
● Facebook Login
● Show me
● Post to wall
47
Facebook Login - Session
●
使用 Facebook SDK 時最重要的一個 object
●
主要用來管理 Facebook 登入時的使用者資訊及
讀寫資料時的權限
48
Facebook Login
Session session = Session.openActiveSessionFromCache(this);
if (session == null) {
Session.openActiveSession(this, true, callback);
} else {
txtToken.setText(session.getAccessToken());
}
49
Facebook Login
private Session.StatusCallback callback = new
StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
txtToken.setText(session.getAccessToken());
}
};
50
Facebook Login
@Override
public void onActivityResult(int requestCode, int
resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this,
requestCode, resultCode, data);
}
51
Facebook Login 步驟
●
有安裝 FB app
– 未登入過 FB :出現 FB app 登入畫面,登入後跳回原 app 詢問授
權,並儲存 token 在本機快取
– 已登入過 FB :在原 app 詢問授權,並儲存 token 在本機快取
– 已登入過原 app :直接使用本機快取的 token
●
未安裝 FB app
– 未登入過 FB :出現 FB web 登入對話框,登入後跳回原 app 詢問
授權,並儲存 token 在本機快取
– 已登入過原 app :直接使用本機快取的 token
52
Playing
53
Show me
● GraphUser
– 對應至 Graph API 的 User object
– 所有關於使用者的資料都對應在這個 object 內
● com.facebook.widget.ProfilePictureView
– 顯示使用者的頭像
– setProfileId(String) :設定使用者 id 並顯示頭像
54
Show me - invoke permission
Session session = Session.getActiveSession();
List<String> newPermissions = Arrays.asList("user_birthday");
NewPermissionsRequest request = new NewPermissionsRequest(this,
newPermissions);
session.requestNewReadPermissions(request);
55
Show me - read userinfo
Request.executeMeRequestAsync(session, new GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
txtMe.setText(String.format(ME_FORMAT, user.getId(),
user.getName(), user.getBirthday(), user.getUsername()));
imgMe.setProfileId(user.getId());
cancelLoading();
}
}
});
56
Playing
57
Post to wall
● Post
– 在 FB 的每一篇留言、讚、評論,都以 Post 為基礎
58
Post to wall - invoke permission
Session session = Session.getActiveSession();
List<String> newPermissions = Arrays.asList("publish_stream");
NewPermissionsRequest request = new NewPermissionsRequest(this,
newPermissions);
session.requestNewPublishPermissions(request);
59
Post to wall - post some message
Bundle args = new Bundle();
args.putString("message", edtPost.getText().toString());
Request postRequest = new Request(session, "me/feed", args,
HttpMethod.POST);
new RequestAsyncTask(postRequest).execute();
60
Playing
61
工商服務時間
三竹資訊
三竹資訊
券商下單全國第一名
商用簡訊全國第一名
行動銀行市佔率高
三竹資訊
●
招募: iOS 、 Android 、行動網頁人才
●
福利:加班費、購機半價優
惠、 MacBook Pro
65

More Related Content

Similar to 行動平台上利用Facebook API開發社群應用程式

The Journey of Source Generator
The Journey of Source GeneratorThe Journey of Source Generator
The Journey of Source GeneratorRoberson Liou
 
Android Wear SDK: Level 101
Android Wear SDK: Level 101Android Wear SDK: Level 101
Android Wear SDK: Level 101Jollen Chen
 
Android学习历程(3):用MVC进行重构
Android学习历程(3):用MVC进行重构Android学习历程(3):用MVC进行重构
Android学习历程(3):用MVC进行重构Water Sky
 
Java23种设计模式(总结)
Java23种设计模式(总结)Java23种设计模式(总结)
Java23种设计模式(总结)xuanlong282
 
Page Object in XCUITest
Page Object in XCUITestPage Object in XCUITest
Page Object in XCUITestJz Chang
 
沈阳师范大学课程实践 Java语言部分
沈阳师范大学课程实践 Java语言部分沈阳师范大学课程实践 Java语言部分
沈阳师范大学课程实践 Java语言部分ArBing Xie
 
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式Shengyou Fan
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐zhangsuoyong
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoloadjay li
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code cleanmacrochen
 
前端MVC之backbone
前端MVC之backbone前端MVC之backbone
前端MVC之backboneJerry Xie
 
在雲端上啜飲爪哇
在雲端上啜飲爪哇在雲端上啜飲爪哇
在雲端上啜飲爪哇建興 王
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识yiditushe
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Gelis Wu
 
透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 AppsEric ShangKuan
 
Entity framework 入門第一課
Entity framework 入門第一課Entity framework 入門第一課
Entity framework 入門第一課Sean Lu
 
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較Stipc Nsysu
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 

Similar to 行動平台上利用Facebook API開發社群應用程式 (20)

The Journey of Source Generator
The Journey of Source GeneratorThe Journey of Source Generator
The Journey of Source Generator
 
Android Wear SDK: Level 101
Android Wear SDK: Level 101Android Wear SDK: Level 101
Android Wear SDK: Level 101
 
Android学习历程(3):用MVC进行重构
Android学习历程(3):用MVC进行重构Android学习历程(3):用MVC进行重构
Android学习历程(3):用MVC进行重构
 
Java23种设计模式(总结)
Java23种设计模式(总结)Java23种设计模式(总结)
Java23种设计模式(总结)
 
Page Object in XCUITest
Page Object in XCUITestPage Object in XCUITest
Page Object in XCUITest
 
沈阳师范大学课程实践 Java语言部分
沈阳师范大学课程实践 Java语言部分沈阳师范大学课程实践 Java语言部分
沈阳师范大学课程实践 Java语言部分
 
react-zh-hant.pdf
react-zh-hant.pdfreact-zh-hant.pdf
react-zh-hant.pdf
 
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoload
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code clean
 
前端MVC之backbone
前端MVC之backbone前端MVC之backbone
前端MVC之backbone
 
在雲端上啜飲爪哇
在雲端上啜飲爪哇在雲端上啜飲爪哇
在雲端上啜飲爪哇
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
 
透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps
 
Entity framework 入門第一課
Entity framework 入門第一課Entity framework 入門第一課
Entity framework 入門第一課
 
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
KSDG_007_Web 編程另闢蹊徑-GWT,Dart,TypeScript介紹與比較
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 

More from Mu Chun Wang

如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進Mu Chun Wang
 
深入淺出 autocomplete
深入淺出 autocomplete深入淺出 autocomplete
深入淺出 autocompleteMu Chun Wang
 
你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事Mu Chun Wang
 
網路服務就是一連串搜尋的集合體
網路服務就是一連串搜尋的集合體網路服務就是一連串搜尋的集合體
網路服務就是一連串搜尋的集合體Mu Chun Wang
 
老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統Mu Chun Wang
 
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能Mu Chun Wang
 
Funliday 新創生活甘苦談
Funliday 新創生活甘苦談Funliday 新創生活甘苦談
Funliday 新創生活甘苦談Mu Chun Wang
 
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度Mu Chun Wang
 
如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件Mu Chun Wang
 
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題Mu Chun Wang
 
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構Mu Chun Wang
 
Google Maps 開始收費了該怎麼辦?
Google Maps 開始收費了該怎麼辦?Google Maps 開始收費了該怎麼辦?
Google Maps 開始收費了該怎麼辦?Mu Chun Wang
 
Git 可以做到的事
Git 可以做到的事Git 可以做到的事
Git 可以做到的事Mu Chun Wang
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-ControlMu Chun Wang
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化Mu Chun Wang
 
如何與全世界分享你的 Library
如何與全世界分享你的 Library如何與全世界分享你的 Library
如何與全世界分享你的 LibraryMu Chun Wang
 
如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌Mu Chun Wang
 
API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一Mu Chun Wang
 
手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務Mu Chun Wang
 

More from Mu Chun Wang (20)

如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進如何在有限資源下實現十年的後端服務演進
如何在有限資源下實現十年的後端服務演進
 
深入淺出 autocomplete
深入淺出 autocomplete深入淺出 autocomplete
深入淺出 autocomplete
 
你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事你畢業後要任職的軟體業到底都在做些什麼事
你畢業後要任職的軟體業到底都在做些什麼事
 
網路服務就是一連串搜尋的集合體
網路服務就是一連串搜尋的集合體網路服務就是一連串搜尋的集合體
網路服務就是一連串搜尋的集合體
 
老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統老司機帶你上手 PostgreSQL 關聯式資料庫系統
老司機帶你上手 PostgreSQL 關聯式資料庫系統
 
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
使用 PostgreSQL 及 MongoDB 從零開始建置社群必備的按讚追蹤功能
 
Funliday 新創生活甘苦談
Funliday 新創生活甘苦談Funliday 新創生活甘苦談
Funliday 新創生活甘苦談
 
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
大解密!用 PostgreSQL 提升 350 倍的 Funliday 推薦景點計算速度
 
如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件如何使用 iframe 製作一個易於更新及更安全的前端套件
如何使用 iframe 製作一個易於更新及更安全的前端套件
 
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
pppr - 解決 JavaScript 無法被搜尋引擎正確索引的問題
 
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
模糊也是一種美 - 從 BlurHash 探討前後端上傳圖片架構
 
Google Maps 開始收費了該怎麼辦?
Google Maps 開始收費了該怎麼辦?Google Maps 開始收費了該怎麼辦?
Google Maps 開始收費了該怎麼辦?
 
Git 可以做到的事
Git 可以做到的事Git 可以做到的事
Git 可以做到的事
 
那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control那些大家常忽略的 Cache-Control
那些大家常忽略的 Cache-Control
 
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
如何利用 OpenAPI 及 WebHooks 讓老舊的網路服務也可程式化
 
如何與全世界分享你的 Library
如何與全世界分享你的 Library如何與全世界分享你的 Library
如何與全世界分享你的 Library
 
如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌
 
API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一API Blueprint - API 文件規範的三大領頭之一
API Blueprint - API 文件規範的三大領頭之一
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
 
手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務手把手教你如何串接 Log 到各種網路服務
手把手教你如何串接 Log 到各種網路服務
 

行動平台上利用Facebook API開發社群應用程式

  • 1. 行動平台上利用 Facebook API 開 發社群應用程式 kewang
  • 3. 3 Me ● 姓名:王慕羣 ● 現職:三竹資訊 研發工程師 ● Android 上架 app : http://bit.ly/18m1gUh ● GitHub : http://github.com/kewang
  • 4. 4 Agenda ● 基礎 Android 開發 ● 簡介 Facebook Platform ● Facebook for Android 動手做
  • 9. 9 Hello World 解析 - Main.java public class Main extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
  • 10. 10 Hello World 解析 - main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
  • 11. 11 Hello World 解析 - strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Hello World</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> </resources>
  • 12. 12 Hello World 解析 - AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.helloworld" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.helloworld.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
  • 14. 14 基本 widgets ● ViewGroup :可以包含任意個數的 view ● TextView :單純顯示文字的 view ● EditText :可以輸入文字的 view ● Button :可以按下觸發事件的 view
  • 15. 15 基本 widgets - ViewGroup ● LinearLayout :將 view 以線性方式排列 – android:orientation="horizontal" :橫式排列 – android:orientation="vertical" :直式排列 ● RelativeLayout :將 view 以相對位置排列 – android:alignParentRight="true" :靠齊上一層的右邊 – android:toRightOf="{view-id}" :放在 {view} 的右邊 – android:layout_above="{view-id}" :放在 {view} 的上面
  • 16. 16 基本 widgets - TextView ● 常用來顯示文字,是大部分顯示用 widget 的 parent class ● setText :指定文字內容 ● setAllCaps :指定英文字顯示時為大寫 ● setGravity :指定文字對齊方式 ● getText().toString() :傳回所顯示的文字
  • 17. 17 基本 widgets - EditText ● 常用來輸入文字 ● setText :指定文字內容 ( 與 TextView 同 ) ● setHint :指定未輸入文字時的文字框內容 ● addTextChangedListener :利用此方法將所輸入 的文字轉換為另種文字
  • 18. 18 基本 widgets - Button ● 常用來執行動作 ● setText :指定文字內容 ( 與 TextView 同 ) ● setOnClickListener :按下此 widget 時所執行的 動作
  • 20. 20 BaseActivity( 個人偏好寫法 ) public abstract class BaseActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId()); findView(); setView(); setListener(); doExtra(); } public abstract int getLayoutId(); public abstract void findView(); public abstract void setView(); public abstract void setListener(); public abstract void doExtra(); }
  • 21. 21 BaseActivity ● getLayoutId :該 Activity 要套用的 layout id ● findView :找出要運用的 view widgets ● setView :設定 view 的屬性,如 color,size... 等 ● setListener :設定 view 的事件觸發 ● doExtra :當進入 Activity 時初始化要做的事
  • 22. 22 BaseActivity 範例 public class MainActivity extends BaseActivity { private EditText edtShow; private TextView txtShow; private Button btnShow; @Override public int getLayoutId() { return R.layout.activity_main; } @Override public void findView() { edtShow = (EditText) findViewById(R.id.edit_show); txtShow = (TextView) findViewById(R.id.text_show); btnShow = (Button) findViewById(R.id.button_show); }
  • 23. 23 BaseActivity 範例 @Override public void setView() { edtShow.setHint("可以在這邊輸入文字"); } @Override public void setListener() { btnShow.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { txtShow.setText(edtShow.getText().toString()); } }); } @Override public void doExtra() { Toast.makeText(this, "Initialize", Toast.LENGTH_LONG).show(); } }
  • 25. 25 Android 開發必讀 ● Develop | Android Developers
  • 28. 28 Facebook Platform ● Open Graph ● Social Plugins ● Graph API ● Dialogs ● Facebook Login ● FQL ● Client SDK
  • 29. 29 Open Graph ● 由 Facebook 發明。 ● 建構在現有的網頁技術上面。 ● 以語意網 (Semantic Web) 的概念開始。 ● 只要在任何一個網頁的 metadata 內加入一些特 定屬性,就可以讓使用者在特定網站 ( 目前大 都為 Facebook) 引用這個網頁時,能收集到使用 者的眾多資訊。
  • 32. 32 Open Graph 與隱私權相關討論 ● Open Graph Overview ● Facebook Open Graph的 與 平台政策修改 新 聞整理 ● Facebook你應該要害怕 嗎? ● Facebook Graph API –新 推出 你打算跟魔鬼做 交易了嗎? ● Facebook社群抓力:你的喜好 都知道
  • 33. 33 Social Plugins ● 不在 Facebook ,也能 Facebook ● 能讓你的朋友在其他網站知道你喜歡什麼、評 論什麼或是分享了什麼 ● 包含了 "Like" 、 "Comment" 、 "Share Dialog"... 等眾多的社交功能。
  • 38. 38 Social Plugins 相關資源 ● Like Button ● Comments Box
  • 39. 39 Graph API ● Facebook 的核心 ● 幾乎所有的 Facebook API 都是由此衍生而來 – Open Graph, Social Plugins... 等 – Android, iOS, PHP,JavaScript... 等 client SDK ● 開發必讀 – API References – Graph API Explorer
  • 40. 40 Graph API ● 包含各種物件: Photo, Link, User,Page, Post... 等 ● 以 JSON 格式呈現 ● 每個在 Graph 上面的物件都有唯一 id – 網址: http://graph.facebook.com/{id} ● User 及 Page 除了唯一 id 外,也有唯一 name ex. ● http://graph.facebook.com/1440581349 ● http://graph.facebook.com/kewangtw
  • 41. 41 Graph API ● 包含一個名為 me 的特殊路徑 – http://graph.facebook.com/me ( 必須先取得 token) – http://graph.facebook.com/{my-id} – http://graph.facebook.com/{my-name}
  • 42. 42 Graph API example ● Publishing a post – curl -F 'access_token=...' -F 'message=Hello. I like this new API.' https://graph.facebook.com/{user-id}/feed ● Likes and Comments – curl -F 'access_token=...' https://graph.facebook.com/ {object-id}/likes – curl -F 'access_token=...' https://graph.facebook.com/ {object-id}/comments ● Facebook APIs › Graph API › Post
  • 43. 43 Graph API Explorer ● Easy to use Graph API
  • 46. 46 Facebook for Android 動手做 ● Facebook Login ● Show me ● Post to wall
  • 47. 47 Facebook Login - Session ● 使用 Facebook SDK 時最重要的一個 object ● 主要用來管理 Facebook 登入時的使用者資訊及 讀寫資料時的權限
  • 48. 48 Facebook Login Session session = Session.openActiveSessionFromCache(this); if (session == null) { Session.openActiveSession(this, true, callback); } else { txtToken.setText(session.getAccessToken()); }
  • 49. 49 Facebook Login private Session.StatusCallback callback = new StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { txtToken.setText(session.getAccessToken()); } };
  • 50. 50 Facebook Login @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); }
  • 51. 51 Facebook Login 步驟 ● 有安裝 FB app – 未登入過 FB :出現 FB app 登入畫面,登入後跳回原 app 詢問授 權,並儲存 token 在本機快取 – 已登入過 FB :在原 app 詢問授權,並儲存 token 在本機快取 – 已登入過原 app :直接使用本機快取的 token ● 未安裝 FB app – 未登入過 FB :出現 FB web 登入對話框,登入後跳回原 app 詢問 授權,並儲存 token 在本機快取 – 已登入過原 app :直接使用本機快取的 token
  • 53. 53 Show me ● GraphUser – 對應至 Graph API 的 User object – 所有關於使用者的資料都對應在這個 object 內 ● com.facebook.widget.ProfilePictureView – 顯示使用者的頭像 – setProfileId(String) :設定使用者 id 並顯示頭像
  • 54. 54 Show me - invoke permission Session session = Session.getActiveSession(); List<String> newPermissions = Arrays.asList("user_birthday"); NewPermissionsRequest request = new NewPermissionsRequest(this, newPermissions); session.requestNewReadPermissions(request);
  • 55. 55 Show me - read userinfo Request.executeMeRequestAsync(session, new GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { txtMe.setText(String.format(ME_FORMAT, user.getId(), user.getName(), user.getBirthday(), user.getUsername())); imgMe.setProfileId(user.getId()); cancelLoading(); } } });
  • 57. 57 Post to wall ● Post – 在 FB 的每一篇留言、讚、評論,都以 Post 為基礎
  • 58. 58 Post to wall - invoke permission Session session = Session.getActiveSession(); List<String> newPermissions = Arrays.asList("publish_stream"); NewPermissionsRequest request = new NewPermissionsRequest(this, newPermissions); session.requestNewPublishPermissions(request);
  • 59. 59 Post to wall - post some message Bundle args = new Bundle(); args.putString("message", edtPost.getText().toString()); Request postRequest = new Request(session, "me/feed", args, HttpMethod.POST); new RequestAsyncTask(postRequest).execute();
  • 64. 三竹資訊 ● 招募: iOS 、 Android 、行動網頁人才 ● 福利:加班費、購機半價優 惠、 MacBook Pro
  • 65. 65