歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Facebook Android SDK 4.14使用詳解

Facebook Android SDK 4.14使用詳解

日期:2017/3/1 9:10:32   编辑:Linux編程

作為一名東南亞APP開發者,Facebook登錄和分享是繞不過去的一個功能,最近將APP裡的Facebook登錄和分享SDK升級到2016年8月的版本,代碼改動挺大,現在把具體的代碼貼出來供後來者升級SDK方便

首先看一下實現效果:

Facebook SDK 的部署方法:

首先,你需要去注冊一個開發賬號,然後用app的包名和SHA1獲得一個app_id

好了現在可以開始正式部署了,首先引用官網的初始化方案:(以下內容來自https://developers.facebook.com/docs/android/getting-started)

Android Studio 設置

要在項目中使用 Facebook SDK,請將其添加為構建依賴項,然後導入。

1.前往 Android Studio | New Project(新項目)| Minimum SDK(最低 SDK)

2.選擇 API 15: Android 4.0.3 或更高版本,然後創建新項目。

3.創建新項目後,打開 your_app | build.gradle(您的應用 | build.gradle)

4.將以下字串添加至模塊級 /app/build.gradledependencies 之前:(注:這裡可以不寫)

repositories {
	mavenCentral()}

5.將配置最新版本 Facebook SDK 的 compile 依賴項添加到 build.gradle 文件(注:這裡我用的是4.14.1 2016年8月18日新版):

dependencies { 
  compile 'com.facebook.android:facebook-android-sdk:4.+'}

6.構建項目,然後即可將 com.facebook.FacebookSdk 導入應用。

使用 Facebook SDK 之前,需要先進行初始化。添加調用 FacebookSdk.sdkInitializeonCreateActivity 中的 Application

// Add this to the header of your file:import com.facebook.FacebookSdk;// Updated your class body:@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);FacebookSdk.sdkInitialize(getApplicationContext());// Initialize the SDK before executing any other operations,// especially, if you're using Facebook UI elements.}

添加 Facebook 應用編號(注:這個編號一般為15位左右)

然後向項目的 strings 文件添加您的 Facebook 應用編號,並更新 Android 清單:

1.打開 strings.xml 文件。示例路徑:/app/src/main/res/values/strings.xml

2.添加新的字符串(名稱為 facebook_app_id,值為 Facebook 應用編號)

3.打開 AndroidManifest.xml

4.將 uses-permission 元素添加到清單:

<uses-permissionandroid:name="android.permission.INTERNET"/>

5.將 meta-data 元素添加到 application 元素內:

<applicationandroid:label="@string/app_name" ...>
    ...
    <meta-dataandroid:name="com.facebook.sdk.ApplicationId"android:value="@string/facebook_app_id"/>
    ...
</application>

使用登錄或分享功能

要使用 Facebook 登錄或分享功能,還需要將 FacebookActivity 添加到清單:

<activityandroid:name="com.facebook.FacebookActivity"android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:label="@string/app_name"/>

發送圖片或視頻

如果要通過 Android 版 Facebook 應用分享鏈接、圖片或視頻,還需要在清單文件中聲明FacebookContentProvider

authorities 值的末尾添加您的應用編號。例如,如果 Facebook 應用編號是 1234(注:實際為15位左右的數字),則聲明應如下圖所示:

<providerandroid:authorities="com.facebook.app.FacebookContentProvider1234"android:name="com.facebook.FacebookContentProvider"android:exported="true"/>

好了,基本的環境現在已經配置好了,可以開始著手做登錄功能了。

首先需要在xml布局中添加一個facebook按鈕

注:這個facebook按鈕不一定要放在xml裡,我一般都自定義一個帶有點擊事件的控件,然後再點擊事件中 new一個facebook按鈕,然後調用它的callonClick()方法,實現出來和點擊原生按鈕一樣,但是自定義按鈕可以實現更多的點擊事件和設置背景圖片等。

/**
     * 初始化facebook的SDK自帶按鈕
     * 這裡會把點擊事件攔住,不會向下層的facebook button傳遞,然後先執行自定義的點擊事件,再執行facebook button的原生點擊事件
     * 可以在自定義點擊事件裡寫一些記錄追蹤或者動畫的代碼
     * @param clickView 用來代替原生facebook按鈕的自定義View,用來攔截點擊事件,可以傳null
     * @param lbFacebook facebook原生登錄按鈕
     * @param addtionalClickEvent  攔截facebook原生按鈕點擊事件,並附加一個點擊事件,可以傳null
     */
    public void initFBLoginButton(View clickView, final LoginButton lbFacebook, Fragment fragment,FacebookCallback<LoginResult> facebookCallback,final Runnable addtionalClickEvent){
        initFBLoginButton(lbFacebook,fragment,facebookCallback);
        if(clickView == null)return;
        clickView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                JLogUtils.i("AlexFB","點擊了facebook上面的按鈕");
                signOut();//點擊登錄按鈕先登出
                if(addtionalClickEvent != null)addtionalClickEvent.run();//先執行自定義點擊事件
                lbFacebook.callOnClick();//再執行facebook登錄按鈕原生點擊事件
            }
        });
    }

    /**
     * 初始化facebook登錄按鈕,需要自己寫一個登錄回調傳進來
     * @param lbFacebook
     * @param fragment 可以傳null
     * @param facebookCallback
     */
    public void initFBLoginButton(LoginButton lbFacebook, Fragment fragment, FacebookCallback<LoginResult> facebookCallback){
        lbFacebook.setReadPermissions("public_profile", "email", "user_birthday", "user_status");
        // 如果你把登陸按鈕放在一個fragment裡面,就用這個方法,用來使用fragment啟動facebook的activity並調用fragment的onActivityResult
        if(fragment != null)lbFacebook.setFragment(fragment);
        // Other app specific specialization
        facebookCallbackManager = CallbackManager.Factory.create();
        // z注冊登錄回調
        lbFacebook.registerCallback(facebookCallbackManager,facebookCallback);
    }


布局文件可以這麼設置

 <RelativeLayout
            android:id="@+id/ll_facebook"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="41dp"
            android:layout_marginRight="41dp"
            android:layout_below="@id/llHeader"
            android:layout_marginTop="20dp"
            >

            
            <TextView
                android:id="@+id/tv_facebook"
                android:layout_width="match_parent"
                android:textColor="@color/white"
                android:background="@drawable/sign_up_facebook"
                android:textSize="50dp"
                android:layout_height="52dp" />
        </RelativeLayout>


這裡並沒有像官網說的那樣使用原生com.facebook.login.widget.LoginButton按鈕,而是用了一個TextView代替,好處是TextView可以自由設定大小,背景圖片,點擊事件,而原生按鈕不行。java中這樣部署:

lbFacebook = new LoginButton(getContext());
        facebookHelper.initFBLoginButton(tv_facebook, lbFacebook, this, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                JLogUtils.i("AlexFB","facebook登錄成功");
                if(loginResult == null) return;
                JLogUtils.i("AlexFB","token是"+loginResult.getAccessToken());
                JViewUtils.showProgressBar(loginRegisterActivity);
                for(String s:loginResult.getRecentlyGrantedPermissions()){
                    JLogUtils.i("AlexFB","被授予的權限是::"+s);
                }
                getUserFacebookBasicInfo();//獲取facebook登錄用戶的基本信息的方法
            }

            @Override
            public void onCancel() {
                // App code
                JLogUtils.i("AlexFB","facebook登錄被取消");
            }

            @Override
            public void onError(FacebookException exception) {
                // App code
                JLogUtils.i("AlexFB","facebook登錄出現異常",exception);
            }
        }, new Runnable() {
            @Override
            public void run() {
                JLogUtils.i("Alex","點擊了tv");
                //寫一些其他的點擊事件,比如動畫,事件追蹤等
            }
        });


此時用戶點擊了我的TextView之後會獲得和點擊原生登錄按鈕一樣的效果,如果用戶手機上裝了Facebook的客戶端,那麼就會開啟客戶端,然後馬上返回此頁面,用facebook APP上的登錄用戶進行登錄;如果用戶沒有安裝Facebook APP,那麼就開啟一個WebView 的Activity讓用戶通過網頁登陸,並在登錄完成後返回此頁面。

因為兩種方式最後都會返回點擊登錄按鈕的頁面,會調用該頁面的onActivityResult的方法,所以要在onActivityResult()中使用SDK提供的CallbackManager這個類接收facebook的登錄回調,代碼如下:

if(facebookHelper != null && facebookHelper.facebookCallbackManager!= null)facebookHelper.facebookCallbackManager.onActivityResult(requestCode, resultCode, data);
       

這裡的facebookHelper是我自己寫的一個管理類,是fragment的一個成員,facebookHelper把CallbackManager作為自己的成員進行調用

注意只有接收了onActivityResult()的回調才會登錄調用登錄回調的方法。

好了登錄步驟結束了,我們可以獲得一個和用戶有關的token字段,但是有這個還不夠啊,我們還需要一些基本的用戶信息,比如用戶的名字,性別,年齡,頭像等等,才能完成一套登錄注冊流程。

下面就需要使用剛剛獲得的token去聯網異步的獲取用戶的基本信息了,這裡我們拿著上一步的token,開啟異步網絡線程,從facebook那裡拿到一個json字符串,然後用json解析得到我們想要的數據,通過接口回調將獲得數據回調給UI界面,方法如下

/**
     *  獲取用戶的基本信息,比如姓名,年齡,userId,性別等等
     * @param callback
     */
    public static void getUserFacebookBasicInfo(final FacebookUserInfoCallback callback) {
        // 獲取基本文本信息
        JLogUtils.i("AlexFB", "准備獲取facebook用戶基本信息");
        if(callback == null)return;
        GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                if (response == null) {
                    callback.onFailed("無法獲取用戶基本信息");
                    return;
                }
                JLogUtils.i("AlexFB", "獲取用戶基本信息完畢,object是" + object);
                JSONObject responseJsonObject = response.getJSONObject();
                JLogUtils.i("AlexFB", "而response 的object是" + responseJsonObject);//這兩個jsonObject是一樣的
                if (responseJsonObject == null) {
                    callback.onFailed("無法獲取用戶基本信息2" + response.getError().getErrorType() + "   " + response.getError().getErrorMessage());
                    return;
                }
                FaceBookUserInfo userInfo = new FaceBookUserInfo();
                userInfo.id = getFacebookGraphResponseString(responseJsonObject, "id");
                userInfo.firstName = getFacebookGraphResponseString(responseJsonObject, "first_name");
                userInfo.lastName = getFacebookGraphResponseString(responseJsonObject, "last_name");
                userInfo.userName = getFacebookGraphResponseString(responseJsonObject, "name");
                userInfo.birthday = getFacebookGraphResponseString(responseJsonObject, "birthday");
                userInfo.updateTime = getFacebookGraphResponseString(responseJsonObject, "updated_time");
                userInfo.email = getFacebookGraphResponseString(responseJsonObject, "email");
                userInfo.gender = getFacebookGraphResponseString(responseJsonObject, "gender");
                callback.onCompleted(userInfo);
            }
        });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,link,email,first_name,last_name,gender,locale,timezone,updated_time,verified");
        request.setParameters(parameters);
        request.executeAsync();
    }

    /**
     * 獲取用戶的token之後,根據此token聯網獲取該用戶詳細信息的回調函數
     */
    public interface FacebookUserInfoCallback{
        void onCompleted(FaceBookUserInfo userInfo);//成功回調
        void onFailed(String reason);//失敗回調
    }
    public interface FacebookUserImageCallback{
        void onCompleted(String imageUrl);//成功回調
        void onFailed(String reason);//失敗回調
    }

    /**
     * 用於存儲Facebook用戶基本信息的類
     */
    public static class FaceBookUserInfo {
        public String id;
        public String firstName;
        public String lastName;
        public String userName;
        public String birthday;
        public String location;
        public String updateTime;
        public String email;
        public String gender;
        public String avatar;//頭像url
    }

    private static String getFacebookGraphResponseString(JSONObject graphResponse, String flag) {
        String value = "";
        try {
            value = graphResponse.getString(flag);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        JLogUtils.i("AlexFB","獲取用戶信息 flag="+flag+"   結果是"+value);
        return value;
    }


在UI界面調用方法:

AlxFacebookHelper.getUserFacebookBasicInfo(new AlxFacebookHelper.FacebookUserInfoCallback() {
            @Override
            public void onCompleted(AlxFacebookHelper.FaceBookUserInfo userInfo) {
                if (loginRegisterActivity.facebookUser == null) loginRegisterActivity.facebookUser = new ThirdPartyFacebookUserInfoEntity();<span >		</span>//下面是一些執行登錄記錄的代碼
                loginRegisterActivity.facebookUser.setId(userInfo.id);
                loginRegisterActivity.facebookUser.setFirstName(userInfo.firstName);
                loginRegisterActivity.facebookUser.setLastName(userInfo.lastName);
                loginRegisterActivity.facebookUser.setUserName(userInfo.userName);
                loginRegisterActivity.facebookUser.setBirthday(userInfo.birthday);
                loginRegisterActivity.facebookUser.setUpdateTime(userInfo.updateTime);
                loginRegisterActivity.facebookUser.setEmail(userInfo.email);
                loginRegisterActivity.facebookUser.setGender(userInfo.gender);
                //用戶基本信息獲取完畢,准備根據用戶id獲取用戶頭像
                fbGetFacebookUserPictureInfoFromFB(loginRegisterActivity.facebookUser.getId());
            }

            @Override
            public void onFailed(String reason) {
                JLogUtils.i("AlexFB","獲取facebook用戶信息失敗::"+reason);
                AlxFacebookHelper.signOut();
            }
        });


獲取用戶頭像的url在剛才步驟拿不到,必須再開一個異步請求向facebook請求用戶頭像的url,在這個過程中我們還可以指定我們想要的頭像的分辨率,保證拿到的頭像清晰,這一步需要用到上一步得到的userId,然後異步獲得一個json串,解析出我們想要的頭像url,並通過接口將獲得結果回調給ui界面,代碼如下

/**
     * 通過facebook的userId,聯網異步獲取用戶的頭像url
     * @param facebookUserId
     */
    public static void getFacebookUserPictureAsync(String facebookUserId, final FacebookUserImageCallback callback) {
        JLogUtils.i("AlexFB","准備獲取用戶頭像");
        if(callback == null || facebookUserId == null || facebookUserId.length()==0)return;
        Bundle parameters = new Bundle();
        parameters.putBoolean("redirect", false);
        parameters.putString("height", "200");
        parameters.putString("type", "normal");
        parameters.putString("width", "200");
        GraphRequest graphRequest= new GraphRequest(AccessToken.getCurrentAccessToken(), "/" + facebookUserId + "/picture", parameters, HttpMethod.GET, new GraphRequest.Callback() {
            public void onCompleted(GraphResponse response) {
                if (response == null) {
                    callback.onFailed("獲取用戶facebook頭像失敗");
                    return;
                }

                if (response.getError() != null) {
                    FacebookRequestError facebookRequestError = response.getError();
                    callback.onFailed("獲取用戶facebook頭像失敗2::" + facebookRequestError.getErrorMessage());
                    return;
                }

                JSONObject responseJsonObject = response.getJSONObject();
                if (responseJsonObject == null) {
                    callback.onFailed("獲取用戶facebook頭像失敗3");
                    return;
                }
                JLogUtils.i("AlexFB", "facebook直接返回的頭像信息是" + responseJsonObject.toString());
                String avatarUrl = "";
                try {
                    JSONObject dataJsonObject = responseJsonObject.getJSONObject("data");
                    avatarUrl = dataJsonObject.getString("url");
                    avatarUrl = URLEncoder.encode(avatarUrl, "UTF-8");
                    JLogUtils.i("AlexFB", "用戶頭像獲取完畢 avatarUrl:" + avatarUrl);
                } catch (Exception e) {
                    callback.onFailed("獲取用戶facebook頭像失敗4"+e.getStackTrace().toString());
                }
                callback.onCompleted(avatarUrl);
            }
        }
        );
        JLogUtils.i("AlexFB","version:"+graphRequest.getVersion()+"");
        graphRequest.executeAsync();
    }


UI界面調用代碼:

AlxFacebookHelper.getFacebookUserPictureAsync(facebookUserId,new AlxFacebookHelper.FacebookUserImageCallback() {
            @Override
            public void onCompleted(String imageUrl) {
                //成功獲取到了頭像之後
                loginRegisterActivity.facebookUser.setAvatar(imageUrl);
                //用戶的頭像和基本信息都獲取完畢,現在可以向我們自己的服務器注冊facebook用戶了
                ...
                
            }

            @Override
            public void onFailed(String reason) {
                AlxFacebookHelper.signOut();//如果獲取失敗了,別忘了將整個登錄結果回滾
                JLogUtils.i("AlexFB",reason);
            }
        });



好了,基本的登錄過程現在就完成了,下面說一下分享的代碼:

因為有了SDK,在使用分享功能呢的時候會在自己的APP上面壓一個cardView,相對於舊版SDK將一個Activity直接壓在自己APP上來說,這樣的用戶體驗更好一點


下面說一下具體的代碼實現:

/**
     * 通過facebook sdk的默認彈出框進行分享
     * @param activity
     */
    public static void showFacebookShareDialog(Activity activity,String link,String description,String caption,String imageUrl,ShareFacebookCallback callback) {
        if (activity == null) {
            if(callback!=null)callback.onFailure("activity 為空");
            return;
        }
        if (!ShareDialog.canShow(ShareLinkContent.class)) {
            if(callback!=null)callback.onFailure("現在不能分享");
            return;
        }
        try {
            ShareDialog shareDialog = new ShareDialog(activity);
            ShareLinkContent.Builder builder = new ShareLinkContent.Builder();
            if(!TextUtils.isEmpty(caption)) builder.setContentTitle(caption);
            if(!TextUtils.isEmpty(description)) builder.setContentDescription(description);
            if(!TextUtils.isEmpty(link))builder.setContentUrl(Uri.parse(link));
            if(!TextUtils.isEmpty(imageUrl)) builder.setImageUrl(Uri.parse(imageUrl));
            ShareLinkContent linkContent= builder.build();
            shareDialog.show(linkContent);
            if(callback!=null)callback.onSuccess();
        } catch (Exception ex) {
            if(callback!=null)callback.onFailure(ex.getStackTrace().toString());
        }
    }


UI界面調用方法

public static void publishFacebookStoryByNativeApp(Activity activity, FacebookStoryEntity entity, final Handler handler) {
        //將要飛翔的數據傳過來,發送到工具類的方法裡
            String link = entity.getLink();
            String applicationname = entity.getApplicationName();
            String description = entity.getDescription();
            String name = entity.getName();
            String caption = entity.getCaption();
            String picture = entity.getPicture();
        AlxFacebookHelper.showFacebookShareDialog(activity, link, description, caption, picture, new AlxFacebookHelper.ShareFacebookCallback() {
            @Override
            public void onSuccess() {
                JLogUtils.i("AlexFB","share fb彈窗框建立成功");
            }

            @Override
            public void onFailure(String reason) {
                JLogUtils.i("AlexFB",reason);
                //執行一些分享失敗的動作
            }
        });
    }

這樣一個分享就ok了。

最後把我自己寫的工具類的全部代碼都貼出來,裡面設置了很多回調用的接口,不要和facebook SDK中的接口搞混了

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.View;

import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookRequestError;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.HttpMethod;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.ShareDialog;
import com.imaginato.qravedconsumer.utils.JLogUtils;

import org.json.JSONException;
import org.json.JSONObject;

import java.net.URLEncoder;


/**
 * Created by Administrator on 2016/8/16.
 */
public class AlxFacebookHelper {
    public CallbackManager facebookCallbackManager;

    /**
     * 初始化facebook的SDK自帶按鈕
     * 這裡會把點擊事件攔住,不會向下層的facebook button傳遞,然後先執行自定義的點擊事件,再執行facebook button的原生點擊事件
     * 可以在自定義點擊事件裡寫一些記錄追蹤或者動畫的代碼
     * @param clickView 壓在facebook原生登錄按鈕上面的View,用來攔截點擊事件,可以傳null
     * @param lbFacebook facebook原生登錄按鈕
     * @param addtionalClickEvent  攔截facebook原生按鈕點擊事件,並附加一個點擊事件,可以傳null
     */
    public void initFBLoginButton(View clickView, final LoginButton lbFacebook, Fragment fragment,FacebookCallback<LoginResult> facebookCallback,final Runnable addtionalClickEvent){
        initFBLoginButton(lbFacebook,fragment,facebookCallback);
        if(clickView == null)return;
        clickView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                JLogUtils.i("AlexFB","點擊了facebook上面的按鈕");
                signOut();//點擊登錄按鈕先登出
                if(addtionalClickEvent != null)addtionalClickEvent.run();//先執行自定義點擊事件
                lbFacebook.callOnClick();//再執行facebook登錄按鈕原生點擊事件
            }
        });
    }

    /**
     * 初始化facebook登錄按鈕,需要自己寫一個登錄回調傳進來
     * @param lbFacebook
     * @param fragment 可以傳null
     * @param facebookCallback
     */
    public void initFBLoginButton(LoginButton lbFacebook, Fragment fragment, FacebookCallback<LoginResult> facebookCallback){
        lbFacebook.setReadPermissions("public_profile", "email", "user_birthday", "user_status");
        // 如果你把登陸按鈕放在一個fragment裡面,就用這個方法,用來使用fragment啟動facebook的activity並調用fragment的onActivityResult
        if(fragment != null)lbFacebook.setFragment(fragment);
        // Other app specific specialization
        facebookCallbackManager = CallbackManager.Factory.create();
        // z注冊登錄回調
        lbFacebook.registerCallback(facebookCallbackManager,facebookCallback);
    }

    /**
     *  獲取用戶的基本信息,比如姓名,年齡,userId,性別等等
     * @param callback
     */
    public static void getUserFacebookBasicInfo(final FacebookUserInfoCallback callback) {
        // 獲取基本文本信息
        JLogUtils.i("AlexFB", "准備獲取facebook用戶基本信息");
        if(callback == null)return;
        GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                if (response == null) {
                    callback.onFailed("無法獲取用戶基本信息");
                    return;
                }
                JLogUtils.i("AlexFB", "獲取用戶基本信息完畢,object是" + object);
                JSONObject responseJsonObject = response.getJSONObject();
                JLogUtils.i("AlexFB", "而response 的object是" + responseJsonObject);//這兩個jsonObject是一樣的
                if (responseJsonObject == null) {
                    callback.onFailed("無法獲取用戶基本信息2" + response.getError().getErrorType() + "   " + response.getError().getErrorMessage());
                    return;
                }
                FaceBookUserInfo userInfo = new FaceBookUserInfo();
                userInfo.id = getFacebookGraphResponseString(responseJsonObject, "id");
                userInfo.firstName = getFacebookGraphResponseString(responseJsonObject, "first_name");
                userInfo.lastName = getFacebookGraphResponseString(responseJsonObject, "last_name");
                userInfo.userName = getFacebookGraphResponseString(responseJsonObject, "name");
                userInfo.birthday = getFacebookGraphResponseString(responseJsonObject, "birthday");
                userInfo.updateTime = getFacebookGraphResponseString(responseJsonObject, "updated_time");
                userInfo.email = getFacebookGraphResponseString(responseJsonObject, "email");
                userInfo.gender = getFacebookGraphResponseString(responseJsonObject, "gender");
                callback.onCompleted(userInfo);
            }
        });
        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,link,email,first_name,last_name,gender,locale,timezone,updated_time,verified");
        request.setParameters(parameters);
        request.executeAsync();
    }

    /**
     * 獲取用戶的token之後,根據此token聯網獲取該用戶詳細信息的回調函數
     */
    public interface FacebookUserInfoCallback{
        void onCompleted(FaceBookUserInfo userInfo);//成功回調
        void onFailed(String reason);//失敗回調
    }
    public interface FacebookUserImageCallback{
        void onCompleted(String imageUrl);//成功回調
        void onFailed(String reason);//失敗回調
    }

    /**
     * 用於存儲Facebook用戶基本信息的類
     */
    public static class FaceBookUserInfo {
        public String id;
        public String firstName;
        public String lastName;
        public String userName;
        public String birthday;
        public String location;
        public String updateTime;
        public String email;
        public String gender;
        public String avatar;//頭像url
    }

    private static String getFacebookGraphResponseString(JSONObject graphResponse, String flag) {
        String value = "";
        try {
            value = graphResponse.getString(flag);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        JLogUtils.i("AlexFB","獲取用戶信息 flag="+flag+"   結果是"+value);
        return value;
    }

    /**
     * 通過facebook的userId,聯網異步獲取用戶的頭像url
     * @param facebookUserId
     */
    public static void getFacebookUserPictureAsync(String facebookUserId, final FacebookUserImageCallback callback) {
        JLogUtils.i("AlexFB","准備獲取用戶頭像");
        if(callback == null || facebookUserId == null || facebookUserId.length()==0)return;
        Bundle parameters = new Bundle();
        parameters.putBoolean("redirect", false);
        parameters.putString("height", "200");
        parameters.putString("type", "normal");
        parameters.putString("width", "200");
        GraphRequest graphRequest= new GraphRequest(AccessToken.getCurrentAccessToken(), "/" + facebookUserId + "/picture", parameters, HttpMethod.GET, new GraphRequest.Callback() {
            public void onCompleted(GraphResponse response) {
                if (response == null) {
                    callback.onFailed("獲取用戶facebook頭像失敗");
                    return;
                }

                if (response.getError() != null) {
                    FacebookRequestError facebookRequestError = response.getError();
                    callback.onFailed("獲取用戶facebook頭像失敗2::" + facebookRequestError.getErrorMessage());
                    return;
                }

                JSONObject responseJsonObject = response.getJSONObject();
                if (responseJsonObject == null) {
                    callback.onFailed("獲取用戶facebook頭像失敗3");
                    return;
                }
                JLogUtils.i("AlexFB", "facebook直接返回的頭像信息是" + responseJsonObject.toString());
                String avatarUrl = "";
                try {
                    JSONObject dataJsonObject = responseJsonObject.getJSONObject("data");
                    avatarUrl = dataJsonObject.getString("url");
                    avatarUrl = URLEncoder.encode(avatarUrl, "UTF-8");
                    JLogUtils.i("AlexFB", "用戶頭像獲取完畢 avatarUrl:" + avatarUrl);
                } catch (Exception e) {
                    callback.onFailed("獲取用戶facebook頭像失敗4"+e.getStackTrace().toString());
                }
                callback.onCompleted(avatarUrl);
            }
        }
        );
        JLogUtils.i("AlexFB","version:"+graphRequest.getVersion()+"");
        graphRequest.executeAsync();
    }

    /**
     * 解綁facebook
     */
    public static void signOut(){
        JLogUtils.i("AlexFB","准備正式解綁本地的facebook登錄信息");
        try {
            if (AccessToken.getCurrentAccessToken() != null) LoginManager.getInstance().logOut();//登出facebook
        }catch(Exception ex){
            JLogUtils.i("AlexFB","登出出現異常");
        }

    }

    /**
     * 使用facebook彈出框進行分享的代碼
     */
    public interface ShareFacebookCallback{
        void onSuccess();
        void onFailure(String reason);
    }

    /**
     * 通過facebook sdk的默認彈出框進行分享
     * @param activity
     */
    public static void showFacebookShareDialog(Activity activity,String link,String description,String caption,String imageUrl,ShareFacebookCallback callback) {
        if (activity == null) {
            if(callback!=null)callback.onFailure("activity 為空");
            return;
        }
        if (!ShareDialog.canShow(ShareLinkContent.class)) {
            if(callback!=null)callback.onFailure("現在不能分享");
            return;
        }
        try {
            ShareDialog shareDialog = new ShareDialog(activity);
            ShareLinkContent.Builder builder = new ShareLinkContent.Builder();
            if(!TextUtils.isEmpty(caption)) builder.setContentTitle(caption);
            if(!TextUtils.isEmpty(description)) builder.setContentDescription(description);
            if(!TextUtils.isEmpty(link))builder.setContentUrl(Uri.parse(link));
            if(!TextUtils.isEmpty(imageUrl)) builder.setImageUrl(Uri.parse(imageUrl));
            ShareLinkContent linkContent= builder.build();
            shareDialog.show(linkContent);
            if(callback!=null)callback.onSuccess();
        } catch (Exception ex) {
            if(callback!=null)callback.onFailure(ex.getStackTrace().toString());
        }
    }
}

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved