Facebook的Andr​​oid SDK中 - 用户的电子邮件返回null电子邮件、用户、Andr、Facebook

由网友(活在风浪里)分享简介:我有以下code表示签到用户的Facebook通过我的应用程序。我收到user.getproperty(电子邮件)作为空第一次。当我运行的应用程序,第二次我得到的价值。下面是我的code。私人无效loginToFb(){最后Session.NewPermissionsRequest newPermissionsRequ...

我有以下code表示签到用户的Facebook通过我的应用程序。我收到user.getproperty(电子邮件)作为空第一次。当我运行的应用程序,第二次我得到的价值。下面是我的code。

私人无效loginToFb(){

 最后Session.NewPermissionsRequest newPermissionsRequest =新Session.NewPermissionsRequest(
            LandingPageActivity.this,Arrays.asList(
                    user_location,user_birthday,
                    user_likes,电子邮件));
    Session.openActiveSession(这一点,真,新Session.StatusCallback(){

        //回调时,会话状态变化
        @覆盖
        公共无效呼叫(会话的会话,SessionState会的状态,
                例外的例外){
            如果(session.isOpened()){
                session.requestNewReadPermissions(newPermissionsRequest);
                //使请求/ ME API
                请求请求= Request.newMeRequest(会话,
                        新Request.GraphUserCallback(){

                            //后与用户图形API响应回调
                            // 目的
                            @覆盖
                            公共无效onCompleted(GraphUser用户,
                                    响应响应){
                                如果(用户!= NULL){
                                    fetchUserFbDetails(用户);
                                }
                            }

                        });
                Request.executeBatchAsync(要求);

            }

        }
    });

}
 

解决方案

问题是,你要求里面的状态回调新的权限,但你会立即作出meRequest之前,新的权限请求完成(全权限和会话打开请求是异步的)。

既然你问了只读权限,就没有必要进行单独的许可要求,你可以做到这一切一气呵成。是这样的:

  Session.OpenRequest openRequest =新Session.OpenRequest(LandingPageActivity.this);
openRequest.setPermissions(Arrays.asList ...);
openRequest.setCallback(新Session.StatusCallback(){
    //回调时,会话状态变化
    @覆盖
    公共无效呼叫(会话的会话,SessionState会的状态,
            例外的例外){
        如果(session.isOpened()){
            //使请求/ ME API
            请求请求= Request.newMeRequest(会话,
                    新Request.GraphUserCallback(){

                        //后与用户图形API响应回调
                        // 目的
                        @覆盖
                        公共无效onCompleted(GraphUser用户,
                                响应响应){
                            如果(用户!= NULL){
                                fetchUserFbDetails(用户);
                            }
                        }

                    });
            request.executeAsync();

        }
});
会话会话=新的Session(LandingPageActivity.this);
Session.setActiveSession(会议);
session.openForRead(openRequest);
 

I am having the following code that signin the user to facebook through my app. I am getting user.getproperty("email") as null first time. when i run the app second time i am getting the value. below is my code.

private void loginToFb() {

    final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
            LandingPageActivity.this, Arrays.asList(
                    "user_location", "user_birthday",
                    "user_likes", "email"));
    Session.openActiveSession(this, true, new Session.StatusCallback() {

        // callback when session changes state
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            if (session.isOpened()) {
                session.requestNewReadPermissions(newPermissionsRequest);
                // make request to the /me API
                Request request = Request.newMeRequest(session,
                        new Request.GraphUserCallback() {

                            // callback after Graph API response with user
                            // object
                            @Override
                            public void onCompleted(GraphUser user,
                                    Response response) {
                                if (user != null) {
                                    fetchUserFbDetails(user);
                                }
                            }

                        });
                Request.executeBatchAsync(request);

            }

        }
    });

}

解决方案

The issue is that you're requesting new permissions INSIDE the status callback, but then you're making the meRequest immediately, before the new permissions request completes (all permissions and session open requests are asynchronous).

Since you're asking for only read permissions, there's no need to make a separate permission request, you can do it all in one go. Something like:

Session.OpenRequest openRequest = new Session.OpenRequest(LandingPageActivity.this);
openRequest.setPermissions(Arrays.asList...);
openRequest.setCallback(new Session.StatusCallback() {
    // callback when session changes state
    @Override
    public void call(Session session, SessionState state,
            Exception exception) {
        if (session.isOpened()) {
            // make request to the /me API
            Request request = Request.newMeRequest(session,
                    new Request.GraphUserCallback() {

                        // callback after Graph API response with user
                        // object
                        @Override
                        public void onCompleted(GraphUser user,
                                Response response) {
                            if (user != null) {
                                fetchUserFbDetails(user);
                            }
                        }

                    });
            request.executeAsync();

        }
});
Session session = new Session(LandingPageActivity.this);
Session.setActiveSession(session);
session.openForRead(openRequest);

阅读全文

相关推荐

最新文章