Подтвердить что ты не робот

Доступ к электронной почте пользователя с помощью нового Android Android SDK

Привет, я играю с новым Android Android SDK. Одна вещь, которую я не мог понять, - как я могу попросить адрес электронной почты. Я пробовал следовать, но он возвращал значения для всех полей, кроме адреса электронной почты. Думаю, мне, вероятно, придется отдельно запрашивать разрешение на адрес электронной почты, но не знаю, как я могу это сделать, если я использую LoginFragment.

Request request = Request.newMeRequest(session, new GraphUserCallback() {

    @Override
    public void onCompleted(GraphUser user, Response response) {
        profilePictureView.setUserId(user.getId());
        userNameView.setText(user.getName());
    }
});

String NAME = "name";
String ID = "id";
String PICTURE = "picture";
String EMAIL = "email";
String FIELDS = "fields";
String REQUEST_FIELDS = TextUtils.join(",", new String[] {
    ID, NAME, PICTURE, EMAIL
});

Bundle parameters = new Bundle();
parameters.putString(FIELDS, REQUEST_FIELDS);
request.setParameters(parameters);
Request.executeBatchAsync(request);

Любая помощь приветствуется. Благодаря

4b9b3361

Ответ 1

Выполните следующие действия:

После установки разрешений, указанных выше, вы получите доступ к электронной почте через: . User.asMap() получить ( "электронная почта" ));

См. пример ниже

@Override
protected void onSessionStateChange(SessionState state, Exception exception) {

    // user has either logged in or not ...
    if (state.isOpened()) {
        // make request to the /me API
        Request request = Request.newMeRequest(this.getSession(),
                new Request.GraphUserCallback() {
                    // callback after Graph API response with user object

                    @Override
                    public void onCompleted(GraphUser user,
                            Response response) {
                        // TODO Auto-generated method stub
                        if (user != null) {
                            TextView etName = (TextView) findViewById(R.id.etName);

                            etName.setText(user.getName() + ","
                                    + user.getUsername() + ","
                                    + user.getId() + "," + user.getLink()
                                    + "," + user.getFirstName()+ user.asMap().get("email"));

                        }
                    }
                });
        Request.executeBatchAsync(request);
    }
}

Ответ 2

Когда вы открываете сеанс, попробуйте включить "email" в список разрешений.

Если вы используете LoginButton, сделайте что-нибудь вроде:

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

Если вы сами открываете сеанс, сделайте следующее:

session.openForRead(new Session.OpenRequest(this).setPermissions(Arrays.asList("email")));

Вы можете экспериментировать с запросами/разрешениями, используя: https://developers.facebook.com/tools/explorer/

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

Ответ 3

Если вы используете com.facebook.widget.LoginButton, вы должны установить разрешения для этого фрагмента, после чего facebook вернет электронное письмо. Вот рабочий код:

LoginButton authButton = findViewById(R.id.sign_in_facebook);
    List<String> permissions = new ArrayList<>();
    permissions.add("public_profile");
    permissions.add("email");
    permissions.add("user_birthday");
    authButton.setReadPermissions(permissions);`

ИЗМЕНИТЬ Facebook обновил его sdk, что облегчило работу с ним. Начиная с версии 4.x(changelog) вы можете инициализировать sdk в разных местах, где это необходимо, и использовать его очень простым способом. Вот пример:

FacebookSdk.sdkInitialize(getActivity().getApplicationContext());
CallbackManager callbackManager = CallbackManager.Factory.create();
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) {
                                    String email = object.optString("email");
                                    String uid = object.optString("id");
                                    loginPresenter.loginBySocial(email, uid);
                                }
                            });
                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "email");
                    request.setParameters(parameters);
                    request.executeAsync();
                }

                @Override
                public void onCancel() {
                  //your code
                }

                @Override
                public void onError(FacebookException exception) {
                  //your code
                }
            });

Ответ 4

Я нашел решение: и он работает

LoginFragment loginFragment = new LoginFragment() {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View v = super.onCreateView(inflater, container, savedInstanceState);
                setReadPermissions(Arrays.asList("email"));
                return v;
            }
        };