简体   繁体   English

Facebook Android SDK 4.5.0 获取邮箱地址

[英]Facebook Android SDK 4.5.0 get email address

I'm currently creating a test application to test using the latest facebook SDK to update our existing application problem is that I need to get the email address which I know depends if the user has provided one on his account.我目前正在创建一个测试应用程序来测试使用最新的 facebook SDK 来更新我们现有的应用程序问题是我需要获取我知道的电子邮件地址,这取决于用户是否在他的帐户中提供了一个。 Now the account I'm using to test provides one for sure but for unknown reason the facebook SDK only provides the user_id and the fullname of the account and nothing else.现在,我用来测试的帐户确实提供了一个,但出于未知原因,facebook SDK 只提供了 user_id 和帐户的全名,没有其他任何内容。 I'm confused on this since the the SDK3 and above provides more information than the updated SDK4 and I'm lost on how to get the email as all the answers I've seen so far doesn't provide the email on my end.我对此感到困惑,因为 SDK3 及更高版本提供的信息比更新的 SDK4 多,而且我不知道如何获取电子邮件,因为到目前为止我看到的所有答案都没有提供我的电子邮件。 Here's my code so far:到目前为止,这是我的代码:

Login Button登录按钮

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

LoginManager Callback:登录管理器回调:

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();
            }
        });

And the request for user profile:以及对用户个人资料的请求:

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();
    }

The JSON response returns only the ID and full name of my account but doesn't include the email. JSON 响应仅返回我的帐户的 ID 和全名,但不包括电子邮件。 Did I missed out something?我错过了什么吗?

You need to ask for parameters to facebook in order to get your data.您需要向 facebook 请求参数才能获取您的数据。 Here I post my function where I get the facebook data.在这里,我发布了我获取 Facebook 数据的函数。 The key is in this line:关键在这一行:

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

Hope it helps you.希望对你有帮助。

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;
}

使用 JSONObject me访问电子邮件,而不是获取graphResponse的值

userEmail = jsonObject.getString("email");

Hope it helps you希望对你有帮助

/*** setupFacebook stuff like make login with facebook and get the userId,Name and Email*/
    private void setupFacebookStuff() {
        Log.e(TAG, "key hash= " + Utils.getKeyHash(SplashActivity.this, getPackageName()));

        // This should normally be on your application class
        FacebookSdk.sdkInitialize(SplashActivity.this);

        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
                   currentAccessToken.getToken();
            }
        };

        loginManager = LoginManager.getInstance();
        callbackManager = CallbackManager.Factory.create();

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

                preference.setUserLogin(true);

                final GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                        try {
                                Log.e("id", "" + object);

                            if (object.has(getString(R.string.fbParamId))) {

                                final String userId = object.optString(getString(R.string.fbParamId));
                                final String userPicture = "https://graph.facebook.com/" + object.optString(getString(R.string.fbParamId)) + "/picture?type=large";

                                preference.setUserId(userId);
                                preference.setUserPictureUrl(userPicture);

                            }
                            if (object.has(getString(R.string.fbParamUserName))) {


                                final String userName = object.optString(getString(R.string.fbParamUserName));
                                preference.setUserName(userName);
                            }

                            if (object.has(getString(R.string.fbParamEmail))) {

                                final String userEmail = object.optString(getString(R.string.fbParamEmail));
                                preference.setUserName(userEmail);
                                Log.e("useremail", userEmail);
                            }

                            callMainActivity(true);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });

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

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

            @Override
            public void onError(FacebookException error) {
                Toast.makeText(getBaseContext(), "Problem connecting to Facebook", Toast.LENGTH_SHORT).show();
                Log.e(TAG, "Facebook login error " + error);
            }
        });
    }

You can also use GraphResponse object to get the values您还可以使用 GraphResponse 对象来获取值

LoginManager.getInstance().registerCallback(callbackManager,
    new FacebookCallback<LoginResult>()
    {
        @Override
        public void onSuccess(LoginResult loginResult)
        {
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject object, GraphResponse response) {
                            Log.v("LoginActivity", response.toString());
                            try {
                                // Application code
                                String email = response.getJSONObject().getString("email");
                                txtStatus.setText("Login Success \n" + email);
                            }catch(Exception e){
                                e.printStackTrace();;
                            }
                        }
                    });
            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,email,gender,birthday");
            request.setParameters(parameters);
            request.executeAsync();
        }

        @Override
        public void onCancel()
        {
            txtStatus.setText("==============Login Cancelled=============");
        }

        @Override
        public void onError(FacebookException exception)
        {
            txtStatus.setText("==============Login Error=================");
            exception.printStackTrace();
        }
    });

Putting this code:把这段代码:

btnLoginFb.setReadPermissions(Arrays.asList("email"));

before

RegisterCallback

should solve the problem.应该可以解决问题。

I guess getting email permissions can help..我想获得电子邮件权限可以帮助..

LoginManager.getInstance().logInWithReadPermissions(
fragmentOrActivity,
Arrays.asList("email"));

Information信息

If you are giving any permission to get an email address.如果您授予任何获取电子邮件地址的权限。 then, Facebook can not every time gives you email address or some other details.那么,Facebook 不能每次都给你电子邮件地址或其他一些细节。

When, Facebook user is not signup with his email-address then Facebook can't provide you his email address.当 Facebook 用户未使用他的电子邮件地址注册时,Facebook 无法向您提供他的电子邮件地址。

If user is login with Facebook using email address then Facebook will provides email to you.如果用户使用电子邮件地址登录 Facebook,那么 Facebook 将向您提供电子邮件。

Facebook SDK provide only public details. Facebook SDK 仅提供公开详细信息。

check a login with Facebook using email-address and also with phone number through.使用电子邮件地址和电话号码检查登录 Facebook。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM