Facebook SDK电子邮件和性别在Android

时间:2016-05-20 10:43:01

标签: java android facebook android-asynctask facebook-sdk-4.0

亲爱的开发人员我尝试从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 并在我的网络服务帖子类中发送该数据,我的课程给出了我的电子邮件和性别错误但是当我执行 AsyncTask 后我将电子邮件和性别悬停在一起时,他们会有这些数据,请帮我解决这个问题。

我想要存储用户基本数据,如果还有其他方式也让我知道我会尝试。

1 个答案:

答案 0 :(得分:1)

出现问题是因为在您的代码中,两个Asynctask同时运行。 意味着GraphRequest类还运行asynctask来获取用户数据,并且您还运行异步以将用户数据发送到服务器。

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

因此解决方案是在onCompleted()方法中调用您的Async任务。 LIKE ..

将此上传数据的异步类写入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();
}
            }
        });

希望这会有所帮助。