編輯:開發入門
對用戶進行授權
Facebook Platform 對 OAuth 2.0 身份認證提供支持,也支持一種較老的、定制的授權簽名方案。編寫新應用程序時應該避免使用老的身份認證方案,因為對這種老方案的支持很快就會取消了。更多有關 OAuth 的信息,請參見 參考資料 中的 OAuth 2.0 Protocol 規范。
Facebook SDK for android 協同 Facebook Platform 一起,隱藏了 OAuth 身份認證的復雜性,如 圖 3 所示。
圖 3. 圖 3. OAuth 2.0 Protocol (IETF)
Facebook SDK for Android 采用移動 web 身份認證方法,而不是采用原生方法。注意,未來版本的 SDK 有可能對 OAuth 提供原生的 android 支持。對於此方法,SDK 在 WebVIEw 中使用 Facebook 基於 web 的身份認證對話框。這是一個有趣的方法,理由如下:
該方法的一個優點是,它有時可能感覺比純粹的原生實現要慢一些。為此,SDK 包含一個備選的身份認證/登錄方法,即使用原生 Facebook 應用程序的單點登錄。這就是說,如果官方 Facebook 原生應用程序安裝在手機上,那麼 Facebook SDK for android 可以使用它的身份認證/登錄活動。但是要使之工作,您必須首先簽署您的應用程序(參見 參考資料 中 Frank Ableson 的文章 “Introduction to android Security”),然後生成一個簽名或密鑰散列(參見 清單 11 )。
清單 11. 清單 11. 生成應用程序密鑰散列
keytool -exportcert -alias [alias] -keystore [keystore] | openssl sha1 -binary | openssl base64
注意, 清單 11 中的代碼通常在一行中。這裡出於格式化目的,將它分成了多行。
然後您必須在 圖 4 所示 mobile and devices 部分下面(查看 圖 4 的 大圖),為您的特定應用程序注冊 Facebook 上生成的密鑰散列。
圖 4. 圖 4. 輸入應用程序密鑰散列
一旦注冊了,您就必須為您的應用程序定義一個 “活動結果處理程序”;實現 onActivityResult(...)
(您必須在它上面調用方法facebook.authorizeCallback(...)
,如 清單 12 所示)。
清單 12. 清單 12. 定義一個活動結果處理程序
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); facebook.authorizeCallback(requestCode, resultCode, data); : : // ... Other onActivityResult steps per your app... }
注意,如果沒有定義單點登錄方法,或者沒有給出原生 Facebook 應用程序,那麼 SDK 將默認對身份認證/登錄使用 WebVIEw 方法。本文其余部分將著重介紹這種默認方法。
正如前面所提到的,默認情況下,應用程序對用戶簡介中的所有公共數據具有訪問權限。要訪問私有數據,應用程序必須請求權限,並由用戶對應用程序授予權限,才能進行訪問。獲得對私有數據進行訪問的權限被稱作擴展權限。
Facebook SDK for android authorize()
方法實現 OAuth 2.0 User-Agent 流,以檢索一個訪問令牌,用於後續的 API 請求中。該方法開始一個活動(原生的 Facebook 應用程序,如果給出並配置了的話)或者一個 WebVIEw 對話框,以提示用戶輸入憑證(身份認證)和權限(授權),參見 清單 13 )。
清單 13. 清單 13. 授權方法
/** * Authorize method that grants custom permissions. */ public void authorize(Activity activity, String[] permissions, final DialogListener listener) { : : }
注意,為了單點登錄身份認證正確工作,您必須在onActivityResult()
函數中包含一個對 authorizeCallback()
方法的調用。
回想一下 清單 8 中登錄菜單項是如何利用權限調用 authorize()
方法的。
清單 14 展示了如何利用權限調用 authorize()
方法,以寫入內容。它也具有權限來寫評論和喜好(publish_stream
)、閱讀用戶的提要、執行搜索(read_stream
)和讓訪問憑證長期有效(offline_Access
)。不要忘記設置您的 APP_ID
。
清單 14. 清單 14. 利用權限調用 authorize()
方法
package com.myapp.facebook.android; : import com.facebook.android.*; : public static final String APP_ID = "13234..."; private static final String[] PERMISSIONS = new String[] {"publish_stream", "read_stream", "offline_Access"}; : : // Call the authorization method mFacebook.authorize( getContext(), APP_ID, mPermissions, new MyLoginDialogListener()); : : // Asynchronous Callback when authorization completes private final class MyLoginDialogListener implements com.facebook.android .Facebook.DialogListener { public void onComplete(Bundle values) {...} // here enable logout public void onFacebookError(FacebookError error) {...} public void onError(DialogError error) {...} public void onCancel() {...} }
authorize()
方法在內部調用前面介紹過的 dialog()
方法,但是這一次它傳遞一個針對操作的 Login 請求。在 Facebook Platform 及其 OAuth 實現的幫助下,authorize()
方法也處理到 Facebook 的身份認證請求,並返回整個 Facebook 會話和 API 調用期間使用的 Access_token:https://graph.facebook.com/ID?Access_token=...
。
有關身份認證如何工作的詳細信息,請參見 參考資料 中的 Facebook Authentication 頁面。
調用 authorize()
方法導致 圖 5 中基於 WebVIEw 的對話框。
圖 5. 圖 5. 授權和權限屏幕 (WebVIEw)
用戶登錄之後,會被提示按照應用程序的請求輸入權限(email 或電話信息和密碼)。用戶可以允許或拒絕應用程序權限訪問她的 Facebook 和執行如下操作:訪問基本信息、發布到用戶的塗鴉牆、訪問 News Feed 中的帖子或者訪問用戶數據。
回頁首
發出 Facebook API 請求
核心 Facebook 類為 Old REST 和 Graph API 調用實現很多request()
方法。此外,SDK 提供幫助器封裝器類來異步地發出核心請求 API 調用。
作為一個 API 請求的例子,您將發出一個請求,為經過身份認證的用戶檢索好友。回想一下 Graph API 的結構:
https://graph.facebook.com/ID/CONNECTION_TYPE
另外,回想一下特殊的 ID me
,它用於識別經過身份認證的用戶,此用戶已經登錄:https://graph.facebook.com/me/frIEnds
。
清單 15 展示了一個來自 清單 8 的代碼片段,即如何實現request()
方法調用。在本例中,您使用AsyncFacebookRunner.request(...)
方法,這是一個幫助器封裝器方法,它通過運行在自己的線程中,使得底層的請求方法是異步的。這一步是為了避免阻塞主 UI 線程。
清單 15. 清單 15. 異步地分配請求
// Get Friend's List case R.id.getfriends: // Wall Post // Get the authenticated user's friends mSpinner.show(); mAsyncRunner.request("me/friends", new FrIEndsRequestListener()); break;
FrIEndsRequestListener onComplete(...)
回調在取得好友列表的請求執行完成時被調用。該方法解析返回的好友列表 JSON。注意, 清單 16 並沒有展示所有實現的方法。
清單 16. 清單 16. 處理取得好友請求
/** * FriendsRequestListener implements a request lister/callback * for "get friends" requests */ public class FrIEndsRequestListener implements com.facebook.android.AsyncFacebookRunner.RequestListener { /** * Called when the request to get friends has been completed. * Retrieve and parse and display the JSON stream. */ public void onComplete(final String response) { mSpinner.dismiss(); try { // process the response here: executed in background thread Log.d("Facebook-Example-Friends Request", "response.length(): " + response.length()); Log.d("Facebook-Example-Friends Request", "Response: " + response); final JSONObject json = new JSONObject(response); JSONArray d = json.getJSONArray("data"); int l = (d != null ? d.length() : 0); Log.d("Facebook-Example-Friends Request", "d.length(): " + l); for (int i=0; i<l; i++) { JSONObject o = d.getJSONObject(i); String n = o.getString("name"); String id = o.getString("id"); Friend f = new Friend(); f.id = id; f.name = n; friends.add(f); } // Only the original owner thread can touch its views SampleApp.this.runOnUiThread(new Runnable() { public void run() { friendsArrayAdapter = new FriendsArrayAdapter( SampleApp.this, R.layout.rowlayout, friends); listView.setAdapter(friendsArrayAdapter); frIEndsArrayAdapter.notifyDataSetChanged(); } }); } catch (JSONException e) { Log.w("Facebook-Example", "JSON Error in response"); } } : : }
根據您的應用程序的要求,來自 Facebook 服務器的響應(JSON 格式)必須相應地被解析和處理。您可能決定通過使用 WebView 或者跟本 SampleApp(參見 圖 6 )中一樣使用 ListVIEw 顯示這樣的信息。
圖 6. 圖 6. 顯示結果
結束語
在本文中,您學習了 Facebook API。首先是 Facebook Platform 及其 API 的一般概述,然後是 Facebook SDK for Android 和一個樣例應用程序。學習本文之後,您更好地了解了各種不同的 Facebook API 以及如何開始為 android 平台編寫 Facebook 應用程序。
簡介本文建立在 “使用 Eclipse 開發 android 應用程序” 一文的基礎之上,探究了 Android 的網絡功能。了解如何利用 Android 的網絡選項來
大家好,我是一個android的初學者,現把在極地星空學習的一些學習筆記發上來,我們共同學習一下。望對初學者的你我有所幫助。android學習有一段時間了,從今天開始,
可以看到Button 與Gallery的對齊方式是居中對齊,也即Button 與Parent居中對齊。另外,:Place object in the vertical
創建內容提供器和 Google Maps 應用程序您已經看到了一個完整的應用程序示例,現在簡要討論一下更加復雜的應用程序。內容提供器和 Google Maps本教程中討