无法在Android中从Facebook获取电子邮件

无法在Android中从Facebook获取电子邮件,android,facebook,email,android-facebook,Android,Facebook,Email,Android Facebook,我试图使用下面的代码通过我的应用程序获取我的facebook电子邮件地址,但返回值为空 public class MainActivity extends AppCompatActivity { private CallbackManager callbackManager; private Button fb; private LoginButton loginButton; private AccessToken accessToken; @Override protected void

我试图使用下面的代码通过我的应用程序获取我的facebook电子邮件地址,但返回值为空

public class MainActivity extends AppCompatActivity {
private CallbackManager callbackManager;
private Button fb;
private LoginButton loginButton;
private AccessToken accessToken;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    callbackManager = CallbackManager.Factory.create();

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

    callbackManager = CallbackManager.Factory.create();
    LoginManager.getInstance().registerCallback(
            callbackManager,
            new FacebookCallback < LoginResult > () {
                @Override
                public void onSuccess(LoginResult loginResult) {

                    accessToken= loginResult.getAccessToken();

                    GraphRequestAsyncTask request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject user, GraphResponse response) {
                            final Profile profile = Profile.getCurrentProfile();

                            if ((user != null) && (profile != null)) {

                                accessToken = AccessToken.getCurrentAccessToken();

                                if (accessToken.getDeclinedPermissions().isEmpty()) {


                                    try {
                                        String email = user.get("email").toString();
                                        Log.e("facebook response email",email+"mm");
                                        Log.e("facebook response",user.toString()+"mm");
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }


                                }


                            }
                        }
                    }).executeAsync();

                }

                @Override
                public void onCancel() {
                }

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

}

public void onClick(View v) {
    if (v == fb) {
        LoginManager.getInstance().logInWithReadPermissions(
                this,
                Arrays.asList("email","public_profile")
        );
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
    accessToken = AccessToken.getCurrentAccessToken();
    if (accessToken != null) {
        Log.e("Token", "Token: " + accessToken.getToken());
        Log.e("UserID", "UserID: " + accessToken.getUserId());
    }
}
public类MainActivity扩展了AppCompatActivity{
私人CallbackManager CallbackManager;
私人按钮;
私人登录按钮登录按钮;
专用AccessToken AccessToken;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
callbackManager=callbackManager.Factory.create();
fb=(按钮)findViewById(R.id.fb);
loginButton=(loginButton)findviewbyd(R.id.login_按钮);
callbackManager=callbackManager.Factory.create();
LoginManager.getInstance().registerCallback(
回拨经理,
新建FacebookCallback(){
@凌驾
成功时公共无效(LoginResult LoginResult){
accessToken=loginResult.getAccessToken();
GraphRequestStatSyncTask请求=GraphRequest.NewMereRequest(AccessToken.getCurrentAccessToken(),new GraphRequest.GraphJSonObject回调(){
@凌驾
未完成公共无效(JSONObject用户,GraphResponse响应){
最终配置文件=Profile.getCurrentProfile();
if((用户!=null)和&(配置文件!=null)){
accessToken=accessToken.getCurrentAccessToken();
if(accessToken.getDeclinedPermissions().isEmpty()){
试一试{
字符串email=user.get(“email”).toString();
Log.e(“facebook回复电子邮件”,电子邮件+“mm”);
Log.e(“facebook响应”,user.toString()+“mm”);
}捕获(JSONException e){
e、 printStackTrace();
}
}
}
}
}).executeAsync();
}
@凌驾
公开作废{
}
@凌驾
public void onError(facebook异常){
}
}
);
}
公共void onClick(视图v){
如果(v==fb){
LoginManager.getInstance().logInWithReadPermissions(
这
Arrays.asList(“电子邮件”、“公共配置文件”)
);
}
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
callbackManager.onActivityResult(请求代码、结果代码、数据);
accessToken=accessToken.getCurrentAccessToken();
if(accessToken!=null){
Log.e(“Token”,“Token:+accessToken.getToken());
e(“UserID”,“UserID:+accessToken.getUserId());
}
}
}

我写了一些代码,但结果是空的? 如何从Facebook SDK获取电子邮件?
我不知道原因是什么,但我可以使用Graph API explorer获取电子邮件地址。有人知道这段代码有什么问题吗?

要检索电子邮件,必须对用户的电子邮件地址显式设置ReadPermission。因此,请在初始化loginButton后在代码中插入以下行

loginButton.setReadPermissions("email");
之后它应该开始返回电子邮件Id


祝你一切顺利

要检索电子邮件,必须显式设置用户电子邮件地址的ReadPermission。因此,请在初始化loginButton后在代码中插入以下行

loginButton.setReadPermissions("email");
之后它应该开始返回电子邮件Id


祝你一切顺利

您需要指定希望从Facebook获得令牌和电子邮件的字段。@WizKidI只知道这些。当你向Facebook发出请求时,你必须指定你想要的字段。否则Facebook不会把它们还给你,我怎样才能在你的选择中解决我的问题@Wizkidou指定您需要电子邮件字段,Facebook会将其返回给您。您需要指定您希望从Facebook获得令牌和电子邮件的字段。这就是@WizKidI所知道的。当你向Facebook发出请求时,你必须指定你想要的字段。否则Facebook不会把它们还给你,我怎样才能在你的选择中解决我的问题@WizKidYou指定您需要电子邮件字段,Facebook会将其返回给您。我认为问题出在这一行logInWithReadPermissions@Baggio-如果正在设置登录按钮,则无需设置LoginManager。LoginButton内置了LoginManager。因此,您不需要两个按钮。一个登录按钮就可以了。此外,您还没有将回调注册到LoginButton中,而是注册到单独的LoginManager实例中。请简化您的代码-只使用FB登录按钮,不需要额外的按钮或LoginManager实例logInWithReadPermissions@Baggio-如果正在设置登录按钮,则无需设置LoginManager。LoginButton内置了LoginManager。因此,您不需要两个按钮。一个登录按钮就可以了。此外,您还没有将回调注册到LoginButton中,而是注册到单独的LoginManager实例中。请简化您的代码-只使用FB登录按钮,不需要额外的按钮或LoginManager实例。