2017年3月28日 星期二

FB Android SDK:登入


一、啟用『單一登入』

要使用FB登入功能,我們須把單一登入的功能開啟
(https://developers.facebook.com/apps/Your FB App ID/settings/)

















二、新增Facebook 登入按鈕

在layout中加入LinkButton  (Facebook所提供客製化按鈕)

<com.facebook.login.widget.LoginButton 
    android:id="@+id/login_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="30dp"
    android:layout_marginBottom="30dp"/>















🌟使用 LoginButton ,我們可以一併用到以下 SDK 提供的類別:

  • LoginManager:使用要求的讀取或發布權限起始登入程序。
  • CallManager:用於將呼叫傳回至 Facebook SDK 以及您的已註冊回呼。應該從起始活動 activity 或片段 fragment 的 onActivityResult 呼叫此函數。
  • AccessToken:使用此類型的圖形 API 要求(GraphAPI)。它會顯示用戶編號及被接受和被拒絕的權限。
  • Profile:此類別具有已登入用戶的基本資訊。


LoginButton 是套件 LoginManager 中可的 UI 控制項。使用者點擊這個按鈕時,將會以 LoginManager 中設定的權限初始化登入。此按鈕會追蹤登入狀態,並根據用戶的驗證狀態顯示正確的文字。


三、增加程式部分


由於目前的 APP 使用 Fragment 設計居多,所以 FB 開發者教學裡是以 Fragment 為主要教學方式。


1. 由於前面四種可用類別(LoginManager、CallManager、AccessToken、Profile)
    如果有用到都會是反覆使用,所以可設定在此對應Activity欄位裡)
    CallbackManager callbackManager;
    AccessToken accessToken;

2.首先要初始化FacebookSdk (一定要先)
FacebookSdk.sdkInitialize(getApplicationContext());


3.連結程式與Layout的Linkbutton
 LoginButton loginButton = (LoginButton) findViewById(R.id.login_button);

4.建立CallbackManager
 callbackManager = CallbackManager.Factory.create();

5.設定當LoginButton收到回傳(callback)的處理動作→成功、失敗、取消
 loginButton.registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    
                 //回傳)的處理動作→成功、失敗、取消                    
                });
















6.將登入成功、取消、失敗等動作加入

//成功
如果登入成功,APP 會收到一組 AccessToken (剛剛程式裡的欄位變數 accessToken),之後要用到 graphAPI 的地方都用這組 token。
接著送一個 request 出去,在 onCompleted 裡面會拿到一個傳入變數 JSONObject (變數名稱是 object),包裹著使用者資訊(name 使用者姓名、link 個人頁面、id)。
 @Override
  public void onSuccess(LoginResult loginResult) {
       accessToken = loginResult.getAccessToken();        //之後也許還會用到,先存起來

       GraphRequest request = GraphRequest.newMeRequest(
                accessToken,
                new GraphRequest.GraphJSONObjectCallback() {
                    //當RESPONSE回來的時候
                    @Override
                   public void onCompleted(JSONObject object, GraphResponse response) {
                     //讀出姓名、ID、網頁連結
                     Log.d("FB" , "complete");
                     Log.d("FB" , object.optString("name"));
                     Log.d("FB" , object.optString("link"));
                     Log.d("FB" , object.optString("id"));
                   }});
       //包入你想要得到的資料,送出 request
       Bundle parameters = new Bundle();
       parameters.putString("fields" , "id,name,link");
       request.setParameters(parameters);
       request.executeAsync();
  }










(可利用圖形API測試取得代碼➜
請見圖形API測試工具文章)



//取消onCancel
 @Override
 public void onCancel() {
       Log.d("FB" , "CANCEL");
 }
//失敗onError
 @Override
 public void onError(FacebookException exception) {
        Log.d("FB", exception.toString());
 }















沒有留言:

張貼留言