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

Я использую Facebook 3.0 SDK для Android. Я должен реализовать вход в систему Facebook . Я получаю доступ к базовой информации пользователя, такой как имя, идентификатор пользователя. Но я хочу иметь доступ к электронной почте и пользователю. Я прошел через многие блоги и форум, но не могу понять, как это сделать.

Я использую свою собственную андроидную кнопку для входа в систему, а не com.facebook.widget.LoginButton . Если я использую кнопку входа в систему Facebook , было бы просто просто использовать эти строки:

 authButton.setReadPermissions(Arrays.asList("basic_info","email")); 

Но, у меня есть свое требование, придется идти с кнопками android по умолчанию. Вот что я сделал до сих пор:

 Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest( this, Arrays.asList("email")); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLogin = (Button) findViewById(R.id.logIn); mLogin.setOnClickListener(this); } @Override public void onClick(View v) { // start Facebook Login Session.openActiveSession(this, true, new Session.StatusCallback() { // callback when session changes state @Override public void call(final Session session, SessionState state, Exception exception) { if (session.isOpened()) { session.requestNewReadPermissions(newPermissionsRequest); // make request to the /me API Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { // callback after Graph API response with user // object @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { System.out .println("Facebook Response: " + response.toString()); access_token = session.getAccessToken(); firstName = user.getFirstName(); fb_user_id = user.getId(); System.out .println("Facebook Access token: " + access_token); System.out.println("First Name:" + firstName); System.out.println("FB USER ID: " + fb_user_id); } } }); } } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } 

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

Что я могу сделать для этого?

Любая помощь будет оценена по достоинству.

Solutions Collecting From Web of "Установите разрешение на получение идентификатора электронной почты пользователя из Facebook."

Решил: вот что я сделал …

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLogin = (Button) findViewById(R.id.logIn); mLogin.setOnClickListener(this); } @Override public void onClick(View v) { Session currentSession = Session.getActiveSession(); if (currentSession == null || currentSession.getState().isClosed()) { Session session = new Session.Builder(context).build(); Session.setActiveSession(session); currentSession = session; } if (currentSession.isOpened()) { // Do whatever u want. User has logged in } else if (!currentSession.isOpened()) { // Ask for username and password OpenRequest op = new Session.OpenRequest((Activity) context); op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); op.setCallback(null); List<String> permissions = new ArrayList<String>(); permissions.add("publish_stream"); permissions.add("user_likes"); permissions.add("email"); permissions.add("user_birthday"); op.setPermissions(permissions); Session session = new Builder(MainActivity.this).build(); Session.setActiveSession(session); session.openForPublish(op); } } public void call(Session session, SessionState state, Exception exception) { } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (Session.getActiveSession() != null) Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); Session currentSession = Session.getActiveSession(); if (currentSession == null || currentSession.getState().isClosed()) { Session session = new Session.Builder(context).build(); Session.setActiveSession(session); currentSession = session; } if (currentSession.isOpened()) { Session.openActiveSession(this, true, new Session.StatusCallback() { @Override public void call(final Session session, SessionState state, Exception exception) { if (session.isOpened()) { Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { TextView welcome = (TextView) findViewById(R.id.welcome); welcome.setText("Hello " + user.getName() + "!"); access_token = session .getAccessToken(); firstName = user.getFirstName(); fb_user_id = user.getId(); System.out .println("Facebook Access token: " + access_token); System.out.println("First Name:" + firstName); System.out.println("FB USER ID: " + fb_user_id); } } }); } } }); } } 

Теперь я могу получить разрешение на электронную почту с остальной частью разрешения на публикацию.

Отмечая это как принятый ответ, чтобы он мог помочь другим.

TL; DR: используйте что-то вроде этого, чтобы получить электронную почту:

 String email = (String) user.getProperty("email"); 

У меня есть один комментарий о вашем коде. Поскольку «электронная почта» является разрешением на чтение, вам не нужно создавать отдельный запрос разрешения для его получения. Вы можете сделать что-то вроде этого (код не проверен, поэтому могут быть небольшие ошибки):

 Session s = new Session(this); Session.setActiveSession(s); Session.OpenRequest request = new Session.OpenRequest(this); request.setPermissions(Arrays.asList("basic_info","email")); request.setCallback( /* your callback here */ ); s.openForRead(request); 

И вы можете избавиться от нового запроса разрешения в своем обратном вызове.