Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 開發入門 >> Facebook SDK for Android (二)

Facebook SDK for Android (二)

編輯:開發入門

對用戶進行授權

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)
OAuth 2.0 Protocol (IETF) 圖 
 

Facebook SDK for Android 采用移動 web 身份認證方法,而不是采用原生方法。注意,未來版本的 SDK 有可能對 OAuth 提供原生的 android 支持。對於此方法,SDK 在 WebVIEw 中使用 Facebook 基於 web 的身份認證對話框。這是一個有趣的方法,理由如下:

  • 它減少了對應用程序實現 OAuth 原生功能的復雜性。
  • 更為重要的是,它通過顯示跟在常規浏覽器上使用 Facebook 時看到的相同的標准而熟悉的登錄和分配權限對話框,贏得用戶的信任。

該方法的一個優點是,它有時可能感覺比純粹的原生實現要慢一些。為此,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. 輸入應用程序密鑰散列
Key hash 字段的屏幕截圖 
 

一旦注冊了,您就必須為您的應用程序定義一個 “活動結果處理程序”;實現 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)
基於 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. 顯示結果
結果為姓名和 ID 列表的屏幕截圖 
 


結束語

在本文中,您學習了 Facebook API。首先是 Facebook Platform 及其 API 的一般概述,然後是 Facebook SDK for Android 和一個樣例應用程序。學習本文之後,您更好地了解了各種不同的 Facebook API 以及如何開始為 android 平台編寫 Facebook 應用程序。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved