作為一名東南亞APP開發者,Facebook登錄和分享是繞不過去的一個功能,最近將APP裡的Facebook登錄和分享SDK升級到2016年8月的版本,代碼改動挺大,現在把具體的代碼貼出來供後來者升級SDK方便
首先看一下實現效果:
Facebook SDK 的部署方法:
首先,你需要去注冊一個開發賬號,然後用app的包名和SHA1獲得一個app_id
好了現在可以開始正式部署了,首先引用官網的初始化方案:(以下內容來自https://developers.facebook.com/docs/android/getting-started)
要在項目中使用 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.gradle
的 dependencies
之前:(注:這裡可以不寫)
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.sdkInitialize
或onCreate
內 Activity
中的 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.}
然後向項目的 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