Android指南
這篇文檔將指導你通過Facebook平台與android集成。我們將通過一步步的關鍵步驟來構建一個android社交app。它將告訴你怎樣允許單點登錄(Single Sign-On)。我們也將圍繞Facebook平台的整合,涵蓋額外的主題。以下是本章目錄
入門
1.使用facebook注冊你的android App
2.下載安裝android SDK
准備你的工程(project)
3.創建新的facebook SDK工程
4.添加引用到facebook SDK
5.設置添加你App的簽名到facebook App中
單點登錄Single Sign On
6.允許單點登錄(Single Sign-On)
6.1 修改AndroidManifest.xml文件來允許網絡傳輸
6.2 Single-Sign-On (SSO)
6.3 安裝facebook android app
6.4 編譯執行項目
6.5 更多權限
6.6 保存你的access token
7.允許用戶注銷你的App
8.擴展access token
添加社交 context
9. 使用 Graph API
10.社交頻道
11. Timeline 和社交圖譜( Open Graph)
錯誤處理
處理錯誤
提示
疑難解答
例子
Hackbook for Android
Open Graph Wishlist
Step 1: 使用facebook注冊你的android App
開始與Facebook平台相結合,在Facebook上創建一個新的應用程序,並輸入你的應用程序的基本信息。(create a new app on Facebook此頁面需要翻牆)

注意你的App ID。當整合Facebook SDK到你的Android App中時,你可以需要修改一些些的代碼。當你的App設置好以后,就可以准備開始整合到facebook中了
Step 2: 下載安裝android SDK
- 首先請確保你安裝了Eclipse
- 設置你的 Java Compliance Level 為Java 1.6: Eclipse->Preferences->Java->Compiler->Compiler Compliance Level->1.6
- 安裝Android SDK 和 Eclipse 插件(ADT)
- 安裝Git: Win Setup, OSX Setup, Linux Setup
- Clone the GitHub repository:
git clone git://github.com/facebook/facebook-android-sdk.git - 創建模擬器,沒有什么特殊的地方,大家都會
Step 3: 創建新的facebook SDK工程
第一次,你將需要為Facebook SDK源碼創建一個新的Android 工程。這僅僅需要一次。因為后面你可以選擇 Create project from existing source指定一下facebook目錄就行了

Step 4:添加引用到Facebook SDK
關於引用facebook SDK你需要如下操作,在你的工程下點擊properties ,按下Add 按鈕然后導入Library

Step 5: 設置添加你App的簽名到facebook App中
Facebook需要額外的一個安全層用來簽名。你需要把你的Android App 簽名 放到你Facebook App Setting中。你可以通過使用keytool 來生成一個簽名。下面顯示怎樣為你的App導出Key。keytool 在你的jdk/bin目錄下 ,例如我是XP系統,這個工具的位置在我打D:\Program Files\Java\jdk1.6\bin\keytool.exe。
以下內容請仔細閱讀:keytool.exe會生成一個keyhash,盡管他找不到你的 debug.keystore。請確保您所提供的debug.keystore的路徑是正確的。. For Windows,通常在 C:\Users\<user>\.android\ for Mac 在 /Users/<user>/.android/
經 過驗證我發現這個文件在我的C:\Documents and Settings\Administrator\.android\debug.keystore。但是我發現在 Eclipse->Window->Preferences->Android->Build
有一個Default debug keystore:D:\Documents\.android\debug.keystore 這里有2個路徑,上網搜了后發現還是用Eclipse下的!
另外,確保你使用正確的密碼 - 用於調試的keystore,默認密碼為“android”生成keyhash。如果工具不能用密碼訪問,就是你的路徑沒設置正確
在CMD下命令為:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 //這是mac下的用"/", windowns下轉為"\"
這里90%以上的人絕對會出問題,首先應該會報錯,提示你openssl這個命令找不到,但是后面 | openssl sha1 -binary | openssl base64這個是不能刪除的, 刪除的話,我顯示的就是亂碼。這里我就baidu弄不出來,沒辦法就使用openssl關鍵字搜索電腦里的所有文件,原來在D:\Program Files\Git\bin中 有我們要的openssl
輸入密碼后,OK了,終於出來了那一串字符
此工具在Mobile 字段生成一個字符串,必須在您的應用程序的開發應用,為移動部分注冊。記得點擊“Save Changes”來保存你的keyhash。

Step 6: 允許單點登錄(Enable Single Sign-On for your App)
Single Sign-On 允許用戶授權你的App並在外部鍵入他們的用戶名和密碼。並通過你的App吧分享的內容發布到facebook上。如果用戶已經安裝並授權了這個 Facebook App,那么你的App能利用Facebook app來單點登錄授權。官方強烈推薦我們使用SSO來授權。
Step 6.1:修改AndroidManifest.xml文件來允許網絡傳輸
一旦Facebook SDK 被引用進來manifest文件就需要修改以允許app可以實現針對facebook的網絡傳輸。實際上來說就是修改AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>

Step 6.2: Single-Sign-On (SSO)
與ios SDK一樣,Android SDK最引人注目的功能之一就是Single-Sign-On (SSO). SSO 讓用戶使用Facebook的身份登錄到你的應用程序. 如果他們已經在自己的設備上簽過名的話,他們就不需要在輸入用戶名和密碼了。你的App就有權訪問他們的在facebook上的個人資料和社交圖譜
用Facebook SDK添加SSO到你的App其實很簡單。下面的例子概述了寫什么樣的代碼能啟用此功能。現在假設你已經有一個MyGreatApp工程。打開 MyGreatApp project -> src -> com.greatapp -> MyGreatActivity.java。並用下面的代碼替換,請注意YOUR_APP_ID需要你填寫你的創建的App_ID。
package com.greatapp;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import com.facebook.android.*;
import com.facebook.android.Facebook.*;
public class MyGreatActivity extends Activity {
Facebook facebook = new Facebook("YOUR_APP_ID");
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
facebook.authorize(this, new DialogListener() {
@Override
public void onComplete(Bundle values) {}
@Override
public void onFacebookError(FacebookError error) {}
@Override
public void onError(DialogError e) {}
@Override
public void onCancel() {}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
facebook.authorizeCallback(requestCode, resultCode, data);
}
}
Step 6.3: 安裝Facebook Android App
啟動一個2.2的模擬器。並使用adb工具安裝 like this(安裝方法有很多種,這里我選個不太常用的安裝方法):

adb install ~/facebook-android-sdk/Facebook.apk
Step 6.4: 編譯執行項目
編譯執行'MyGreatApp' project。他將啟動模擬器。你將會看到一個授權對話框,用來提示你授權

此對話框允許用戶授予你的程序的權限訪問他們的信息。如果用戶按下允許,您的應用程序將被用戶授權,你將通過Facebook的實例可以訪問到用戶的個人資料和社會圖譜。如果用戶按下不允許,不認可你的應用程序,你將不能訪問用戶的數據。
Step 6.5: 更多權限
默認情況下,要求用戶授權訪問應用程序的基本信息是公開的或是Facebook上的默認。如果您的應用程序需要超過這個基本的信息功能,你必須要求從用戶的具體權限。這是通過傳遞的String[]權限的授權方法。下面的例子顯示如何要求獲得用戶的電子郵件地址,得到擴展的access token。
facebook.authorize(this, new String[] { "email", "publish_checkins" },
new DialogListener() {
@Override
public void onComplete(Bundle values) {}
@Override
public void onFacebookError(FacebookError error) {}
@Override
public void onError(DialogError e) {}
@Override
public void onCancel() {}
}
);
下面顯示了一個額外的授權界面,用戶可以允許訪問 all或者none
|
|
|
更多用戶權限請參考http://developers.facebook.com/docs/authentication/permissions/
Step 6.6: 保存你的access token
如果你再次運行你的工程(在用戶已經授權之后),會出現以下提示信息

為了擺脫這個對話框,我們可以使用Shared Preferences.,讓我們來再次修改以前的代碼:
package com.greatapp;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import com.facebook.android.*;
import com.facebook.android.Facebook.*;
public class MyGreatActivity extends Activity {
Facebook facebook = new Facebook("YOUR_APP_ID");
String FILENAME = "AndroidSSO_data";
private SharedPreferences mPrefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*
* Get existing access_token if any
*/
mPrefs = getPreferences(MODE_PRIVATE);
String access_token = mPrefs.getString("access_token", null);
long expires = mPrefs.getLong("access_expires", 0);
if(access_token != null) {
facebook.setAccessToken(access_token);
}
if(expires != 0) {
facebook.setAccessExpires(expires);
}
/*
* Only call authorize if the access_token has expired.
*/
if(!facebook.isSessionValid()) {
facebook.authorize(this, new String[] {}, new DialogListener() {
@Override
public void onComplete(Bundle values) {
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("access_token", facebook.getAccessToken());
editor.putLong("access_expires", facebook.getAccessExpires());
editor.commit();
}
@Override
public void onFacebookError(FacebookError error) {}
@Override
public void onError(DialogError e) {}
@Override
public void onCancel() {}
});
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
facebook.authorizeCallback(requestCode, resultCode, data);
}
}
access token 在onComplete()方法中使用SharedPreferences 保存
請注意下面:
if(!facebook.isSessionValid()) //facebook.authorize()才會被調用
有這么一種情況,用戶修改了密碼,但是他還是願意訪問你的App,如果我們程序沒有看出這一點。那么access token是無效的,在onComplete()時,會返回如下錯誤:
User revoked access to your app:
{"error":{"type":"OAuthException","message":"Error validating access token: User 1053947411 has not authorized application 157111564357680."}}
OR when password changed:
{"error":{"type":"OAuthException","message":"Error validating access token: The session is invalid because the user logged out."}}
Step 7: 允許用戶注銷你的App
mAsyncRunner.logout(getContext(), new RequestListener() {
@Override
public void onComplete(String response, Object state) {}
@Override
public void onIOException(IOException e, Object state) {}
@Override
public void onFileNotFoundException(FileNotFoundException e,
Object state) {}
@Override
public void onMalformedURLException(MalformedURLException e,
Object state) {}
@Override
public void onFacebookError(FacebookError e, Object state) {}
});
Step 8: 擴展access token
原文:
對於離線訪問,用戶每次打開你的App后,你需要擴展access_token。需要需要這樣做你就可以在onResume()方法中調用fackbook SDK中的extendAccessTokenIfNeeded :
public void onResume() {
super.onResume();
facebook.extendAccessTokenIfNeeded(this, null);
}
注意:確保你的SDK是最新的https://github.com/facebook/facebook-android-sdk/
Step 9: 使用 Graph API
你可以理解為Graph 為圖譜,Facebook graph 就是一個社交的圖形界面(eg.人,照片,事件,)並與整個Facebook產生聯系,尤其影響與你相關的人。
以下是一段例子
// get information about the currently logged in user
mAsyncRunner.request("me", new meRequestListener());
// get the posts made by the "platform" page
mAsyncRunner.request("platform/posts", new pageRequestListener());
// get the logged-in user's friends
mAsyncRunner.request("me/friends", new friendsRequestListener());
更多細節請參考facebook上的android sdk 文檔
Step 10: 社交頻道
Android SDK 提供一個方法來顯示facebook平台對話框,只需要一行代碼就能搞定,它並不需要你自己創建一個本地的對話框,並能處理響應。我稍微看了下源碼就是面向接口編程的體現。
Feed Dialog - like this:

//調用feed 對話框的代碼
//post on user's wall.
mFacebook.dialog(context, "feed", new PostDialogListener());
//post on friend's wall.
Bundle params = new Bundle();
params.putString("to", "");
mFacebook.dialog(context, "feed", params, new PostDialogListener());
Request Dialog-like this:

//Send requests with no friend pre-selected and user
//selects friends on the dialog screen.
mFacebook.dialog(context, "apprequests", new AppRequestsListener());
//send request to a particular friend.
Bundle params = new Bundle();
params.putString("to", "");
mFacebook.dialog(context, "apprequests", new AppRequestsListener());
Step 11: Timeline 和社交圖譜( Open Graph)
簡而言之,Facebook就是要做大做強,面向全球化的用戶體驗,並繼續擴大開放平台,使更多好的應用集成到facebook,給用戶帶來更好的體驗
當用戶添加你的App到他們的時間軸(),你的應用程序通過Open Graph分享到Facebook。您的應用程序會成為用戶體驗的重要組成部分,然后連鎖就會產生包括好友,新聞等。建議最好
自己多體驗下facebook的功能和玩法。
Timeline 很快就要登錄移動平台。馬上做好整合的准備吧 ,更多內容請參閱 learn moreor the tutorial.
處理錯誤
下面是一些常見的錯誤和解決方案
-
Build error: "missing gen files".
基本上就是常見的丟失R文件,Clean一下即可
-
Error: "invalid_key"
這個錯誤說明Facebook服務器無法識別你的 Android key hash。 確保你的key hash是正確的,並在Facebook developer settings console保存了
-
Dialog won't load or shows a blank screen.
如果日志沒有顯示錯誤。我們建議你安裝tcpdump 來跟蹤Tutorial: http://www.vbsteven.be/blog/android-debugging-inspectin-network-traffic-with-tcpdump/
如果仍然無法確認是什么問題,請 include the HTTP trace.
-
I can't upload photos with photos.upload.
Make sure the Bundle value for the photo parameter is a byte array.(字節組數)
Tips
-
你需要有一個能測試你Facebook app的環境。 在實際設備上,你可以從Android Market應用程序下載的最新版本,但在模擬器上,你將不得不自行安裝:
-
注意請先安裝sdk中的facebook.apk
-
使用簽名的版本,請注意debug key,確保是匹配的
-
最后依舊是看原文吧guide to developing on a device.
故障排解
-
Key Hash Reference Doc: Signing Your Applications.
-
Keytool command not found error: Keytool標准android sdk會提供,並且jdk中也有,如果你還是提示命令沒找到,請設置 環境變量的path並重啟
-
Openssl: 如果你真找不到openssl,就下載一個吧,但最好還是設置path: Windows, MAC. For Mac說明here.
-
Invalid Key Hash:
-
沒有找到你本地的debug.keystore 。那么請檢查你的路徑。
-
如果密碼錯誤。請注意默認的android。我想你們大概也不會去修改它吧
-
當添加keyhash后,在Setting 控制台上,記得點擊 “保存改變”( 'Save Changes' )
-
如果以上都失敗,請使用cygwin或 linux box 來生成 hashkey.
-
-
Installation [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES] error:卸載干凈點,在重新裝一次
-
onActivityResult() function is not called: 確保'Intent.FLAG_ACTIVITY_NO_HISTORY'沒有在AndroidManifest file中定義
-
App type Web vs Native/Desktop. Does it matter?: No, it does not matter. 但我們推薦使用 'Native/Desktop' for your app.
例子
Hackbook for Android
包含sso的實現,簡單api的調用和像獲得新權限這樣的高級功能,Run FQL Query, Graph API Explorer.

Open Graph Wishlist
Wishlist 是在移動平台上使用自定義對象和動作。它允許用戶創建一個自定義的wishlist,添加產品描述和圖片。並還能附加本地位置(location )



