it-swarm.com.ru

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

В настоящее время я создаю тестовое приложение для тестирования с использованием последней версии Facebook SDK для обновления нашего существующего приложения. Проблема заключается в том, что мне нужно получить адрес электронной почты, который, как я знаю, зависит от того, предоставил ли пользователь его в своей учетной записи. Теперь учетная запись, которую я использую для проверки, предоставляет ее точно, но по неизвестной причине 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 возвращает только идентификатор и полное имя моей учетной записи, но не включает адрес электронной почты. Я что-то упустил?

32
KaHeL

Вам нужно запросить параметры в 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;
}
100
Marta Tenés

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

/*** 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);
            }
        });
    }
3
Sejal Baraiya

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

userEmail = jsonObject.getString("email");
3
Jeongbebs

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

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

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

Информация

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

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

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

Facebook SDK предоставляет только публичные данные.

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

0
D Prince

Положить этот код:

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

до

RegisterCallback

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

0
Rao Farhan