如何从 facebook LoginButton 小部件获取用户的电子邮件?

How to get the email of a user from the facebook LoginButton widget?

如何从 Facebook 登录按钮小部件获取用户的电子邮件?

我要空了。我使用的 App Id 是正确的。我也可以获得正确的名称,但电子邮件丢失了。我有权限。

这是我的代码:

import com.facebook.model.GraphUser;
import com.facebook.widget.LoginButton;
import com.facebook.widget.LoginButton.UserInfoChangedCallback;

// ...

public class MainActivity extends FragmentActivity {

    // ...

    @Override
    public void onCreate(Bundle savedInstanceState) {

        //

        LoginButton loginBtn = (LoginButton) findViewById(R.id.fb_login_button);

        loginBtn.setUserInfoChangedCallback(new UserInfoChangedCallback() {
            @Override
            public void onUserInfoFetched(GraphUser user) {
                if (user != null) {
                    userName.setText("Hello, " + user.getName());
                    Toast.makeText(getApplicationContext(),
                            "User Name is , " + user.getName(), Toast.LENGTH_LONG)
                            .show();
                    Toast.makeText(getApplicationContext(),
                            "Email Id is , " + user.getProperty("email") , Toast.LENGTH_LONG)
                            .show();
                } else {
                    userName.setText("You are not logged");
                }
            }  
        });
    }


    // ...

    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions","email","basic_info");

    public void requestPermissions() {
        Session s = Session.getActiveSession();
        if (s != null)
            s.requestNewPublishPermissions(new Session.NewPermissionsRequest(
                    this, PERMISSIONS));
    }
public class Login extends ActionBarActivity {

    private CallbackManager callbackManager;
    String emailid, gender, bday, username;
    private LoginButton loginButton;

    ProfilePictureView profilePictureView;

    TextView info;
    private AccessTokenTracker accessTokenTracker;

    private ProgressDialog pDialog;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);

        FacebookSdk.sdkInitialize(this.getApplicationContext());

        callbackManager = CallbackManager.Factory.create();

        setContentView(R.layout.login);

        loginButton = (LoginButton) findViewById(R.id.login_button);

        loginButton.setReadPermissions(Arrays
                .asList("public_profile, email, user_birthday, user_friends"));

        loginButton.registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        new fblogin().execute(loginResult.getAccessToken());

                    }

                    @Override
                    public void onCancel() {

                    }

                    @Override
                    public void onError(FacebookException e) {

                    }
                });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

    class fblogin extends AsyncTask<AccessToken, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(Login.this);
            pDialog.setMessage("wait.");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        protected String doInBackground(AccessToken... params) {
            GraphRequest request = GraphRequest.newMeRequest(params[0],
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject object,
                                GraphResponse response) {

                            Log.v("LoginActivity", response.toString());

                            try {

                                username = object.getString("first_name");

                                emailid = object.getString("email");

                                gender = object.getString("gender");

                                bday = object.getString("birthday");

                            } catch (JSONException e) {
                                // TODO Auto-generated catch
                                // block
                                e.printStackTrace();
                            }
                        }
                    });
            Bundle parameters = new Bundle();
            parameters.putString("fields",
                    "id,first_name,email,gender,birthday");
            request.setParameters(parameters);
            request.executeAndWait();

            return null;
        }

        protected void onPostExecute(String file_url) {

            pDialog.dismiss();

        }

    }


}

此方法以异步方式工作。

完成了。 !!

您可以通过发送 Request.newMeRequest 请求来获取用户电子邮件。为此你需要 UiLifecycleHelper 回调
UiLifecycleHelper fbUiHelper = new UiLifecycleHelper(this, fbUiHelperCallback);

private Session.StatusCallback fbUiHelperCallback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    };

private void onSessionStateChange(Session session, SessionState state,
            Exception exception) {
        getUserData(session, state);
    }

 private void getUserData(Session session, SessionState state) {
        if (state.isOpened()) {
            Request.newMeRequest(session, new Request.GraphUserCallback() {

                @Override
                public void onCompleted(GraphUser user, Response response) {
                    if (response != null) {
                        String name = user.getName();
                        // If you asked for email permission
                        String gender = (String) user.getProperty("gender");
                        String email = (String) user.getProperty("email");

                    }
                }

            }).executeAsync();
        }
    }