Как получить идентификатор электронной почты из facebook sdk в приложениях для Android?

Я включил учетную запись Facebook в своем приложении для Android. Я хочу получить идентификатор электронной почты пользователя входа. Как я получу его?

private void loginToFacebook() {
    Session.openActiveSession(this, true, new Session.StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (session.isOpened()) {
                Log.i(TAG, "Access Token" + session.getAccessToken());
                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        if (user != null) {
                            try {

                                 userID =user.getId();
                                 provider="facebook";
                                 userName=user.getUsername();
                                 firstName=user.getFirstName();
                                 lastName=user.getLastName();
                                 Log.d("****User****", "details:" + user);
                                 }catch(Exception e){

Вот мой код. Я использую метод Request.GraphUserCallback(), но от этого метода ответа нет.

Ответ 1

Перед вызовом Session.openActiveSession сделайте это, чтобы получить разрешения:

List<String> permissions = new ArrayList<String>();
permissions.add("email");

Последний параметр Session.openActiveSession() должен быть permissions. Теперь вы можете получить доступ к user.getProperty("email").toString().

EDIT:

Вот как я делаю авторизацию facebook:

List<String> permissions = new ArrayList<String>();
permissions.add("email");

loginProgress.setVisibility(View.VISIBLE);

//start Facebook session
openActiveSession(this, true, new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        if (session.isOpened()) {
            //make request to the /me API
            Log.e("sessionopened", "true");
            Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                @Override
                public void onCompleted(GraphUser user, Response response) {
                    if (user != null) {
                        String firstName = user.getFirstName();
                        String lastName = user.getLastName();
                        String id = user.getId();
                        String email = user.getProperty("email").toString();

                        Log.e("facebookid", id);
                        Log.e("firstName", firstName);
                        Log.e("lastName", lastName);
                        Log.e("email", email);
                    }
                }
            });
         }
     }
 }, permissions);

Добавьте этот метод в свою деятельность:

private static Session openActiveSession(Activity activity, boolean allowLoginUI, Session.StatusCallback callback, List<String> permissions) {
    Session.OpenRequest openRequest = new Session.OpenRequest(activity).setPermissions(permissions).setCallback(callback);
    Session session = new Session.Builder(activity).build();
    if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) {
        Session.setActiveSession(session);
        session.openForRead(openRequest);
        return session;
    }
    return null;
}

Ответ 2

Следуя предложению Егора N, я меняю свой старый код

Session.openActiveSession(this, true, statusCallback);

с этим новым:

List<String> permissions = new ArrayList<String>();
permissions.add("email");
Session.openActiveSession(this, true, permissions, statusCallback);

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

Ответ 3

Попробуйте эту статью. Надеюсь, ваши проблемы будут решены. Нажмите здесь

Btw, вам нужно использовать user.asMap().get("email").toString()); для получения идентификатора электронной почты пользователя. Кроме того, вам необходимо назначить это в какой-либо ярлык, например lblEmail.setText, где lblEmail - это текстовое представление.