最近项目新增一个需求:需要收集用户的邮箱信息。但是直接通过GraphRequest.newMeRequest去获取发现返回值为空,通过查阅资料得知facebook获取用户邮箱还需要授权。
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile,email"));
GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
if (object == null) {
mPresenter.loginThirdPlat(2, loginResult.getAccessToken().getUserId(), nation, information.email);
return;
}
String id = object.optString("id");
String name = object.optString("name");
String gender = object.optString("gender");
String email = object.optString("email");
String locale = object.optString("locale");
//获取用户头像
JSONObject object_pic = object.optJSONObject("picture");
JSONObject object_data = object_pic.optJSONObject("data");
String photo = object_data.optString("url");
getFacebookUserPictureAsync(id, new FaceUserImgCallBack() {
@Override
public void onFailed(String msg) {
LogUtil.v("fb", msg)
}
@Override
public void onCompleted(String url) {
LogUtil.v("fb", url);
}
});
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email,link,gender,birthday,picture,locale,updated_time,timezone,age_range,first_name,last_name");
request.setParameters(parameters);
request.executeAsync();
通过上述方式可以获取到头像信息,不过给的是默认大小的图片地址,如果需要自定义大小的头像地址需要通过如下方式去获取:
/**
* 通过facebook的userId,联网异步获取用户的头像url
*
* @param facebookUserId
*/
public static void getFacebookUserPictureAsync(String facebookUserId, FaceUserImgCallBack callback) {
LogUtil.i("fb", "准备获取用户头像");
if (facebookUserId == null || facebookUserId.length() == 0) return;
Bundle parameters = new Bundle();
parameters.putBoolean("redirect", false);
parameters.putString("height", "500");
parameters.putString("type", "normal");
parameters.putString("width", "500");
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 failed");
return;
}
if (response.getError() != null) {
FacebookRequestError facebookRequestError = response.getError();
callback.onFailed("facebook failed:" + facebookRequestError.getErrorMessage());
return;
}
JSONObject responseJsonObject = response.getJSONObject();
if (responseJsonObject == null) {
callback.onFailed("facebook failed");
return;
}
LogUtil.i("fb", "facebook直接返回的头像信息是" + responseJsonObject.toString());
String avatarUrl = "";
try {
JSONObject dataJsonObject = responseJsonObject.getJSONObject("data");
avatarUrl = dataJsonObject.getString("url");
// avatarUrl = URLEncoder.encode(avatarUrl, "UTF-8");
LogUtil.i("fb", "用户头像获取完毕 avatarUrl:" + avatarUrl);
} catch (Exception e) {
callback.onFailed("facebook failed" + e.getStackTrace().toString());
}
callback.onCompleted(avatarUrl);
}
}
);
LogUtil.i("fb", "version:" + graphRequest.getVersion() + "");
graphRequest.executeAsync();
}
public interface FaceUserImgCallBack {
void onFailed(String msg);
void onCompleted(String url);
}
如此便可以轻松获取facebook相关个人信息