作為一名東南亞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