Facebook Android SDK 4.5.0 получить адрес электронной почты

В настоящее время я создаю тестовое приложение для тестирования с использованием последней версии SDK facebook для обновления нашей существующей проблемы с приложением в том, что мне нужно получить адрес электронной почты, который, как я знаю, зависит от того, предоставил ли пользователь его в своей учетной записи. Теперь учетная запись, которую я использую для тестирования, точно предоставляет ее, но по неизвестной причине SDK facebook предоставляет только user_id и полное имя учетной записи и ничего больше. Я запутался в этом, так как SDK3 и выше предоставляют больше информации, чем обновленный SDK4, и я не понимаю, как получить электронное письмо, поскольку все ответы, которые я видел до сих пор, не предоставляют электронное письмо с моей стороны. Вот мой код:

Кнопка входа

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

Обратный вызов 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();
            }
        });

И запрос профиля пользователя:

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

Ответ JSON возвращает только идентификатор и полное имя моей учетной записи, но не включает адрес электронной почты. Я что-то пропустил?


person KaHeL    schedule 25.08.2015    source источник
comment
Я использую тот же код, и он работал для меня раньше, но сейчас он не работает, не могли бы вы опубликовать полный код. обратный вызов не вызывается   -  person Rahul Chaudhary    schedule 10.09.2015


Ответы (7)


Вам нужно запросить параметры в facebook, чтобы получить ваши данные. Здесь я публикую свою функцию, где я получаю данные facebook. Ключ находится в этой строке:

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

Надеюсь, это поможет вам.

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;
}
person Marta Tenés    schedule 25.08.2015
comment
Мне пришлось добавить btnLoginFb.setReadPermissions(Arrays.asList("email")); непосредственно перед btnLoginFb.registerCallback(...); - person marc_aragones; 09.09.2015
comment
Рада всем помочь :) - person Marta Tenés; 25.11.2015
comment
Я боролся с часами ... В stackoverflow есть несколько ответов, где они не выполнили часть параметров. Большое спасибо. - person suku; 23.02.2016
comment
Есть ли в параметрах опция мобильного номера? Или может кто-нибудь указать список поддерживаемых параметров? Не удалось найти. - person Jignesh Shah; 01.06.2016
comment
@JigneshShah, насколько я знаю, я думаю, что Facebook удалил это разрешение из-за конфиденциальности пользователя. - person Marta Tenés; 01.06.2016
comment
Хороший ответ ... не так уж много там, охватывающих маршрут LoginManager. Все о Связке параметров по запросу 'me': parameters.putString("fields", "id, first_name, last_name, email,gender, birthday, location"); - person scgough; 08.07.2016
comment
У вас отсутствует блок catch для самого внешнего блока try. Итак, те, кто копирует и вставляет напрямую, убедитесь, что вы добавили блок перехвата исключений JSON, иначе вы получите ошибки в своем коде и будете жаловаться без надлежащей проверки. - person Akah; 13.08.2016
comment
перепробовав множество других решений, это единственное, что сработало, я смог получить адрес электронной почты, в то время как другие методы возвращали значение null. - person Manny265; 09.10.2017

Вместо получения значения graphResponse получите доступ к электронной почте с помощью JSONObject me

userEmail = jsonObject.getString("email");
person Jeongbebs    schedule 25.08.2015
comment
Я тоже пробовал это раньше, но не работал. Что я пропустил, так это параметры, которые необходимы перед выполнением запроса. - person KaHeL; 25.08.2015

Надеюсь, это поможет вам

/*** 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);
            }
        });
    }
person Sejal Baraiya    schedule 06.01.2017
comment
электронная почта лучше, чем getString(R.string.fbParamEmail). - person CoolMind; 23.01.2017

Вы также можете использовать объект 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();
        }
    });
person Ritesh    schedule 03.07.2017

Ввод этого кода:

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

до

RegisterCallback

должен решить проблему.

person Rao Farhan    schedule 12.07.2017

Я думаю, получение разрешений на электронную почту может помочь ..

LoginManager.getInstance().logInWithReadPermissions(
fragmentOrActivity,
Arrays.asList("email"));
person Usman Malik    schedule 18.10.2017

Информация

Если вы даете какое-либо разрешение на получение адреса электронной почты. тогда Facebook не сможет каждый раз давать вам адрес электронной почты или какие-то другие данные.

Когда пользователь Facebook не регистрируется со своим адресом электронной почты, Facebook не может предоставить вам его адрес электронной почты.

Если пользователь входит в систему Facebook, используя адрес электронной почты, Facebook предоставит вам адрес электронной почты.

Facebook SDK предоставляет только общедоступную информацию.

проверьте вход в Facebook, используя адрес электронной почты, а также номер телефона.

person Prince Dholakiya    schedule 22.06.2018