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的主要内容,如果未能解决你的问题,请参考以下文章

iOS Facebook SDK:性别被本地化

在 Facebook Graph API 中,获取用户电子邮件地址和性别的 API 调用是啥?

如何使用 Facebook SDK 获取姓名和电子邮件

如何使用 facebook sdk 在 ios 中创建 facebook 测试用户

iOS - Facebook SDK v.4.5.1 - 获取用户名和电子邮件

Facebook SDK 3.7 for Android 请求电子邮件权限