Facebook Android SDK 4.5.0获取电子邮件地址

KaH*_*HeL 32 android facebook facebook-graph-api facebook-sdk-4.x

我正在创建一个测试应用程序来测试使用最新的facebook SDK更新我们现有的应用程序问题是我需要获取我知道的电子邮件地址取决于用户是否在他的帐户中提供了一个.现在,我正在使用的帐户提供了一个肯定的帐户,但由于未知原因,facebook SDK仅提供user_id和帐户的全名,而不提供任何其他内容.我对此感到困惑,因为SDK3及以上版本提供了比更新的SDK4更多的信息,而且我对如何获取电子邮件感到迷茫,因为到目前为止我看到的所有答案都没有提供我的电子邮件.到目前为止,这是我的代码:

登录按钮

@OnClick(R.id.btn_login)
    public void loginFacebook(){
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));
    }
Run Code Online (Sandbox Code Playgroud)

LoginManager回调:

LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                requestUserProfile(loginResult);
            }

            @Override
            public void onCancel() {
                Toast.makeText(getBaseContext(),"Login Cancelled", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(FacebookException e) {
                Toast.makeText(getBaseContext(),"Problem connecting to Facebook", Toast.LENGTH_SHORT).show();
            }
        });
Run Code Online (Sandbox Code Playgroud)

以及用户个人资料的请求:

public void requestUserProfile(LoginResult loginResult){
        GraphRequest.newMeRequest(
                loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject me, GraphResponse response) {
                        if (response.getError() != null) {
                            // handle error
                        } else {
                            try {
                                String email = response.getJSONObject().get("email").toString();
                                Log.e("Result", email);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                            String id = me.optString("id");
                            // send email and id to your web server
                            Log.e("Result1", response.getRawResponse());
                            Log.e("Result", me.toString());
                        }
                    }
                }).executeAsync();
    }
Run Code Online (Sandbox Code Playgroud)

JSON响应仅返回我的帐户的ID和全名,但不包括电子邮件.我错过了什么吗?

Mar*_*nés 101

你需要向facebook索取参数才能获得你的数据.在这里,我发布了我获取facebook数据的功能.关键在于这一行:

parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook
Run Code Online (Sandbox Code Playgroud)

希望它能帮到你.

btnLoginFb.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {

        @Override
        public void onSuccess(LoginResult loginResult) {

            System.out.println("onSuccess");
            progressDialog = new ProgressDialog(LoginActivity.this);
            progressDialog.setMessage("Procesando datos...");
            progressDialog.show();
            String accessToken = loginResult.getAccessToken().getToken();
            Log.i("accessToken", accessToken);

            GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {

                @Override
                public void onCompleted(JSONObject object, GraphResponse response) {
                    Log.i("LoginActivity", response.toString());
                    // Get facebook data from login
                    Bundle bFacebookData = getFacebookData(object); 
                }
            });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); // Parámetros que pedimos a facebook
            request.setParameters(parameters);
            request.executeAsync();
        }

        @Override
        public void onCancel() {
            System.out.println("onCancel");
        }

        @Override
        public void onError(FacebookException exception) {
            System.out.println("onError");
            Log.v("LoginActivity", exception.getCause().toString());
        }
    });



private Bundle getFacebookData(JSONObject object) {

        try {
            Bundle bundle = new Bundle();
            String id = object.getString("id");

            try {
                URL profile_pic = new URL("https://graph.facebook.com/" + id + "/picture?width=200&height=150");
                Log.i("profile_pic", profile_pic + "");
                bundle.putString("profile_pic", profile_pic.toString());

            } catch (MalformedURLException e) {
                e.printStackTrace();
                return null;
            }

            bundle.putString("idFacebook", id);
            if (object.has("first_name"))
                bundle.putString("first_name", object.getString("first_name"));
            if (object.has("last_name"))
                bundle.putString("last_name", object.getString("last_name"));
            if (object.has("email"))
                bundle.putString("email", object.getString("email"));
            if (object.has("gender"))
                bundle.putString("gender", object.getString("gender"));
            if (object.has("birthday"))
                bundle.putString("birthday", object.getString("birthday"));
            if (object.has("location"))
                bundle.putString("location", object.getJSONObject("location").getString("name"));

            return bundle;
        }
      catch(JSONException e) {
        Log.d(TAG,"Error parsing JSON");
      }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不得不在`btnLoginFb.registerCallback(...)之前添加`btnLoginFb.setReadPermissions(Arrays.asList("email"));` (9认同)
  • 对于最外面的try块,你有一个catch块.所以直接复制和粘贴的资金,确保你添加JSON异常catch块,否则你的代码会出现错误,并在没有正确检查的情况下抱怨. (4认同)