Facebook SDK 电子邮件和性别在 android 中为 Null

Facebook SDK email and gender is given Null in android

尊敬的开发者,我正在尝试保存来自 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 方法之后,我 运行ning AsyncTask 并在我的网络服务中发送该数据 post class 我的 class 给我空电子邮件和性别的错误,但是当我在执行 AsyncTask 后悬停电子邮件和性别时,他们有那个数据请帮我解决这个问题。

我想要什么我想存储用户基本数据如果有另一种方法也让我知道我会尝试。

出现这个问题是因为在你的代码中有两个 Asynctask 同时运行。 意味着 GraphRequest class 还运行一个异步任务来获取用户数据,而你也是 运行 一个将用户数据发送到服务器的异步任务。

异步任务总是在单独的线程(而不是主线程)上运行,它们不会等待其他任务完成。

所以解决方案是在 onCompleted() 方法中调用异步任务。喜欢..

写这个异步 class 用于将数据上传到 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 方法中调用此异步 class 并在调用 Asynctask class.

之前检查电子邮件和性别是否不为空
@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();
}
            }
        });

希望这对您有所帮助。