因为两种方式最后都会返回点击登录按钮的页面,会调用该页面的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界面调用方法: