Facebook SDK 电子邮件和性别在 android 中为 Null
Posted
技术标签:
【中文标题】Facebook SDK 电子邮件和性别在 android 中为 Null【英文标题】:Facebook SDK email and gender is given Null in android 【发布时间】:2016-05-20 10:43:00 【问题描述】:亲爱的开发者,我正在尝试从 Facebook 保存数据,我正在获取其他所有数据,但无法获取电子邮件和性别。
这是我的代码
loginButton.setReadPermissions("public_profile");
loginButton.setReadPermissions("email");
loginButton.setReadPermissions("user_friends");
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>()
@Override
public void onSuccess(LoginResult loginResult)
AccessToken accessToken = loginResult.getAccessToken();
GraphRequest request = GraphRequest.newMeRequest( loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback()
@Override
public void onCompleted(JSONObject object,GraphResponse response)
if (response != null)
try
email = object.getString("email");
catch (JSONException e)
e.printStackTrace();
try
gender = object.getString("gender");
catch (JSONException e)
e.printStackTrace();
);
Bundle parameters = new Bundle();
parameters.putString("fields", "email,gender");
request.setParameters(parameters);
request.executeAsync();
Profile profile = Profile.getCurrentProfile();
userid = profile.getId();
userfirstname = profile.getFirstName();
middlename = profile.getMiddleName();
userlastname = profile.getLastName();
userimage = profile.getProfilePictureUri(30, 40);
linkuri = profile.getLinkUri();
name = profile.getName();
new AsyncTask<String, String, String>()
@Override
protected String doInBackground(String... params)
WebService ws = new WebService(URL);
Map<String, String> data = new HashMap<String, String>();
data.put("user_fb_id", userid);
data.put("first_name", userfirstname);
data.put("middle_name", userfirstname);
data.put("gender", gender);
data.put("email", email);
data.put("last_name", userfirstname);
data.put("user_fb_profile_name", name);
data.put("fb_profile_pic", userimage.toString());
try
String response = ws.makeHTTPRequest(data, "POST");
JSONObject jsonObject = new JSONObject(response);
Log.e("Response", jsonObject.toString());
catch (Exception e)
Log.d("", "Exception : " + e.getMessage());
return null;
.execute();
@Override
public void onCancel()
//info = ("Login attempt canceled.");
@Override
public void onError(FacebookException e)
// info = ("Login attempt failed.");
);
现在我会告诉你我上面的代码中的错误是什么。
当我运行 GraphRequest 时,它将成功执行,但没有收到电子邮件和性别。电子邮件和性别等于 null 在 GrapRequest 方法之后,我正在运行 AsyncTask 并将该数据发送到我的 Web 服务发布类中,我的课程给我错误的电子邮件和性别但是当我在执行 AsyncTask 后悬停电子邮件和性别时,他们有这些数据,请帮助我解决这个问题。
如果有其他方法,我想要存储用户基本数据,也让我知道我会尝试。
【问题讨论】:
在某些情况下,虽然用户提供了电子邮件,但如果电子邮件无效,则不会通过请求。 你对电子邮件的看法是对的,但我的情况是电子邮件在那里,它来自请求,但在 AsyncTask 执行之后。我想在 AsyncTask 执行之前得到它。 【参考方案1】:出现问题是因为在您的代码中,两个 Asynctask 同时运行。 意味着 GraphRequest 类还运行 asynctask 来获取用户数据,并且您还运行 async 以将用户数据发送到服务器。
异步任务总是在单独的线程上运行(而不是在主线程上),它们不会等待其他任务完成。
所以解决方案是在 onCompleted() 方法中调用您的异步任务。喜欢..
编写此异步类以将数据上传到 registerCallback 之外的服务器。
private class Upload_Data extends AsyncTask<String, String, String>()
@Override
protected String doInBackground(String... params)
WebService ws = new WebService(URL);
Map<String, String> data = new HashMap<String, String>();
data.put("user_fb_id", userid);
data.put("first_name", userfirstname);
data.put("middle_name", userfirstname);
data.put("gender", gender);
data.put("email", email);
data.put("last_name", userfirstname);
data.put("user_fb_profile_name", name);
data.put("fb_profile_pic", userimage.toString());
try
String response = ws.makeHTTPRequest(data, "POST");
JSONObject jsonObject = new JSONObject(response);
Log.e("Response", jsonObject.toString());
catch (Exception e)
Log.d("", "Exception : " + e.getMessage());
return null;
然后在获取电子邮件和性别值后在 onCompleted 方法中调用此异步类,并在调用 Asynctask 类之前检查电子邮件和性别不为空。
@Override
public void onCompleted(JSONObject object,GraphResponse response)
if (response != null)
try
email = object.getString("email");
catch (JSONException e)
e.printStackTrace();
try
gender = object.getString("gender");
catch (JSONException e)
e.printStackTrace();
if(email!=null && gender!=null)
new Upload_Data().execute();
);
希望这会有所帮助。
【讨论】:
这是行不通的,我将我的帖子 AsyncTask 粘贴到 onActivityResult 但结果相同... 你能告诉我我的代码和你的代码有什么不同 在我的代码中,在 onCompleted 方法中完成 GraphRequest 后上传用户数据异步调用,该方法在从 GraphRequest 获得响应后调用并再次阅读我的完整答案,然后您就会明白其中的区别。 以上代码对我有用,但方法变化不大,我将编辑您的代码,您将批准编辑,以便帮助其他开发人员 兄弟你编辑的代码和我的代码是一样的。我为 UploadAsynctask 创建了一个不同的类,并调用了 onCompleted 方法来降低代码复杂性。以上是关于Facebook SDK 电子邮件和性别在 android 中为 Null的主要内容,如果未能解决你的问题,请参考以下文章
在 Facebook Graph API 中,获取用户电子邮件地址和性别的 API 调用是啥?
如何使用 facebook sdk 在 ios 中创建 facebook 测试用户