如何在 Facebook Android sdk 4.0 中使用 Graph Request 获取登录用户的电子邮件地址

Posted

技术标签:

【中文标题】如何在 Facebook Android sdk 4.0 中使用 Graph Request 获取登录用户的电子邮件地址【英文标题】:How to get the logged user's email address with Graph Request in Facebook Android sdk 4.0 【发布时间】:2015-04-12 14:08:11 【问题描述】:

一旦用户使用 Facebook (sdk 4.0) 登录我的 android 应用程序,我将尝试获取用户的电子邮件地址。我读过很多帖子都问同样的问题,但我仍然无法让它发挥作用。我只是用代码登录用户

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends", "email"));

然后我使用 Graph API 请求

LoginManager.getInstance().registerCallback(fbCallbackManager,
            new FacebookCallback<LoginResult>() 
                @Override
                public void onSuccess(LoginResult loginResult) 
                    System.out.println(loginResult.getAccessToken().toString());

                    GraphRequest request = GraphRequest.newMeRequest(
                            loginResult.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() 
                                @Override
                                public void onCompleted(
                                        JSONObject object,
                                        GraphResponse response) 
                                    System.out.println(object.toString());

                                
                            );
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "email");
                    request.setParameters(parameters);
                    request.executeAsync();
                

                @Override
                public void onCancel() 
                    // App code
                

                @Override
                public void onError(FacebookException exception) 
                    // App code
                
            );

输出只是

AccessToken token:ACCESS_TOKEN_REMOVED permissions:[public_profile, contact_email, user_friends, email, basic_info]
"id":"xxxxxxxxxxxxxxx"

即使我删除了“字段”部分,我也会得到一个包含大量用户公共信息的 JSON,但绝不会包含电子邮件字段。我正在我自己的 Facebook 帐户上对此进行测试,并且我确实有一个与之关联的电子邮件地址。

【问题讨论】:

您找到问题的答案了吗?如果是,请在此处发布作为答案。 实际上,你问题中的代码对我有用,尤其是下面的所有答案,谢谢男人 【参考方案1】:

这是完整的代码,我通过它从 facebook 获取我们需要的所有数据

 login_facebook_button = (LoginButton) findViewById(R.id.login_facebook_button);
    login_facebook_button.setReadPermissions(Arrays.asList("public_profile", "user_friends", "email", "user_birthday"));
    //LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends"));
    // Callback registration
    login_facebook_button.registerCallback(callbackManager, new FacebookCallback<LoginResult>() 
        @Override
        public void onSuccess(LoginResult loginResult) 
            // App code
            Log.e("onSuccess", "--------" + loginResult.getAccessToken());
            Log.e("Token", "--------" + loginResult.getAccessToken().getToken());
            Log.e("Permision", "--------" + loginResult.getRecentlyGrantedPermissions());
            Profile profile = Profile.getCurrentProfile();
            Log.e("ProfileDataNameF", "--" + profile.getFirstName());
            Log.e("ProfileDataNameL", "--" + profile.getLastName());

            Log.e("Image URI", "--" + profile.getLinkUri());

            Log.e("OnGraph", "------------------------");
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() 
                        @Override
                        public void onCompleted(
                                JSONObject object,
                                GraphResponse response) 
                            // Application code
                            Log.e("GraphResponse", "-------------" + response.toString());
                        
                    );
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,link,gender,birthday,email");
            request.setParameters(parameters);
            request.executeAsync();

        

        @Override
        public void onCancel() 
            // App code
        

        @Override
        public void onError(FacebookException exception) 
            // App code
        
    );

日志中调用的响应是:

Response:  responseCode: 200, graphObject: "id":"896337040431723","name":"Aneh Thakur","link":"https:\/\/www.facebook.com\/app_scoped_user_id\/896337040431723\/","gender":"male","birthday":"08\/05\/1992","email":"anehkumar@gmail.com", error: null

希望这会对你有所帮助。

TrinityTuts

【讨论】:

谢谢,这是唯一对我有用的解决方案。 谢谢老兄..它也帮助了我:) 在这里查看所有参数developers.facebook.com/docs/graph-api/reference/v2.6/user【参考方案2】:

您可以通过如下方式获取登录用户的电子邮件,但请注意,

    他们不保证您会收到电子邮件地址read here。

    在某些情况下,虽然用户提供了电子邮件,但如果电子邮件无效,则不会通过请求。

    @Override
    public void onSuccess(LoginResult loginResult) 
    
    
    GraphRequest request = GraphRequest.newMeRequest( AccessToken.getCurrentAccessToken(),
            new GraphRequest.GraphJSONObjectCallback() 
                @Override
                public void onCompleted(JSONObject object,GraphResponse response) 
                try 
                    String  email=object.getString("email");
                    Log.d(TAG + "user email ", email);
                     catch (JSONException e) 
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    
    
                
    
                );
    
                request.executeAsync();                        
     
    

【讨论】:

【参考方案3】:
fbLoginButton.setReadPermissions("public_profile", "user_friends", "user_photos", "email", "user_birthday", "public_profile", "contact_email");

“contact_email”是电子邮件权限,我错过了当我添加它时我得到了工作。

【讨论】:

以上是关于如何在 Facebook Android sdk 4.0 中使用 Graph Request 获取登录用户的电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

Android 如何在新的 sdk 3.0 中与 Facebook Open Graph 共享数据?

我应该如何在带有 Facebook sdk 4 的 Android App 中合并 Like 按钮?

如何在 Facebook Android sdk 4.0 中使用 Graph Request 获取登录用户的电子邮件地址

如何在最新的 Facebook Android SDK 4.6.0 中获取会话类

android facebook sdk,分享——如何检测成功?

facebook sdk android,如何获取用户电话号码?