FaceBook開放平台,移動篇android版 (指南)


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

用戶要停止使用Facebook的整合與您的應用程序你可以調用logout方法以清除應用程序狀態,使服務器的請求當前access_token失效。
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) {}
});
注意注銷不會撤銷你的應用程序的權限,但只會清除你的應用程序的access_token

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 ) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM