Facebook的onCompleted电子邮件显示java.lang.NullPointerException电子邮件、onCompleted、Facebook、NullPointerExcepti

由网友(他是太阳深拥必伤)分享简介:我能得到所有这些事情,如在我的code以下,但无法从用户配置文件中检索电子邮件。I'm able to get all those things as shown in my code below, but unable to retrieve email from the user profile.我能做些什么了...

我能得到所有这些事情,如在我的code以下,但无法从用户配置文件中检索电子邮件。

I'm able to get all those things as shown in my code below, but unable to retrieve email from the user profile.

我能做些什么了吗?

任何形式的帮助将是AP preciated。

Any kind of help will be appreciated.

早些时候,我就是用这个源获取的Facebook用户的详细信息,并获取数据(包括电子邮件)没有任何麻烦:

Earlier I was using this source to get details of Facebook user and was fetching data (including Email) without any trouble:

public class MainActivity extends Activity {
    private Session.StatusCallback sessionStatusCallback;
    private Session currentSession;

    private Button login;
    private Button logout;
    private Button publishButton;

    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);

        // create instace for sessionStatusCallback
        sessionStatusCallback = new Session.StatusCallback() {

            @Override
            public void call(Session session, SessionState state,
                             Exception exception) {
                onSessionStateChange(session, state, exception);

            }
        };

        login = (Button) findViewById(R.id.loginButton);
        login.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                connectToFB();                
            }
        });

        logout = (Button) findViewById(R.id.logoutButton);
        logout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (currentSession != null) {
                    currentSession.closeAndClearTokenInformation();
                    ...
                }
            }
        });

        // publish button
        publishButton = (Button) findViewById(R.id.publishButton);
        publishButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                publishStory();

            }
        });

    }

    public void connectToFB() {

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

        currentSession = new Session.Builder(this).build();
        currentSession.addCallback(sessionStatusCallback);

        Session.OpenRequest openRequest = new Session.OpenRequest(
                MainActivity.this);
        openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        openRequest.setRequestCode(Session.DEFAULT_AUTHORIZE_ACTIVITY_CODE);
        openRequest.setPermissions(permissions);
        currentSession.openForPublish(openRequest);

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (currentSession != null) {
            currentSession
                    .onActivityResult(this, requestCode, resultCode, data);
        }
    }

    private void onSessionStateChange(Session session, SessionState state,
                                      Exception exception) {
        if (session != currentSession) {
            return;
        }

        if (state.isOpened()) {
            // Log in just happened.
            Toast.makeText(getApplicationContext(), "session opened",
                    Toast.LENGTH_SHORT).show();

            Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                @Override
                public void onCompleted(GraphUser user, Response response) {
                    String fbId = user.getId();
                    String fbName = user.getName();
                    String gender = user.asMap().get("gender").toString();
                    String email = user.asMap().get("email").toString();
                    String first = user.asMap().get("first_name").toString();
                    String last = user.asMap().get("last_name").toString();

                    textView.setText("Id: " + fbId + ", Name: " + fbName + ", Gender: " + gender + ", EmailID: " + email + ", First: " + first + ", Last: " + last);
                }
            });

        } else if (state.isClosed()) {
            // Log out just happened. Update the UI.
            Toast.makeText(getApplicationContext(), "session closed",
                    Toast.LENGTH_SHORT).show();
        }
    }

    public void publishStory() {
        ....
    }

}

现在我用同样的code在我的项目之一,但总是因为:

And now I am using same code in one of my project, but always getting:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException 
at c.o.m.MainActivity$5.onCompleted(MainActivity.java:262)
at com.facebook.Request$1.onCompleted(Request.java:303)
at com.facebook.Request$4.run(Request.java:1726)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)

在这一行,我得到的 NPE

 String email = user.asMap().get("email").toString();

code:

public class MainActivity extends Activity {

    Button btnFBLogin, btnGPLogin;

    private Session.StatusCallback sessionStatusCallback;
    private Session currentSession;

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

        setContentView(R.layout.screen_layout);

        sessionStatusCallback = new Session.StatusCallback() {

            @Override
            public void call(Session session, SessionState state,
                             Exception exception) {
                onSessionStateChange(session, state, exception);

            }
        };

        btnFBLogin = (Button) findViewById(R.id.loginFB);
        btnFBLogin.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                connectToFB();
            }
        }); 

    }

    public void connectToFB() {

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

        currentSession = new Session.Builder(this).build();
        currentSession.addCallback(sessionStatusCallback);

        Session.OpenRequest openRequest = new Session.OpenRequest(
                MainActivity.this);
        openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        openRequest.setRequestCode(Session.DEFAULT_AUTHORIZE_ACTIVITY_CODE);
        openRequest.setPermissions(permissions);
        currentSession.openForPublish(openRequest);

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (currentSession != null) {
            currentSession
                    .onActivityResult(this, requestCode, resultCode, data);
        }
    }

    private void onSessionStateChange(Session session, SessionState state,
                                      Exception exception) {
        if (session != currentSession) {
            return;
        }

        if (state.isOpened()) {
            // Log in just happened.
            Toast.makeText(getApplicationContext(), "session opened",
                    Toast.LENGTH_SHORT).show();

            Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                @Override
                public void onCompleted(GraphUser user, Response response) {
                    String fbId = user.getId();
                    String fbName = user.getName();
                    String gender = user.asMap().get("gender").toString();
                    String email = user.asMap().get("email").toString();
                    String first = user.asMap().get("first_name").toString();
                    String last = user.asMap().get("last_name").toString();

                    Toast.makeText(MainActivity.this, "EmailId:- "+email, Toast.LENGTH_LONG).show();
                }
            });

        } else if (state.isClosed()) {
            // Log out just happened. Update the UI.
            Toast.makeText(getApplicationContext(), "session closed",
                    Toast.LENGTH_SHORT).show();
        }
    }
}

可能是什么原因?为什么它的发生?

What could be the reason? Why its happening?

推荐答案

您需要在电子邮件添加到您所需要的权限列表,否则邮件将始终为空。我不知道是什么版本的SDK你使用。随着最后一个你可以写:

You need to add "email" to the list of permissions you're requiring, otherwise the email will always be null. I don't know what version of the sdk you're using. With the last one you can write:

Collection<String> mPermissions = new ArrayList<>();
mPermissions.add("email");
LoginManager mLoginManager = LoginManager.getInstance();
CallbackManager mCallbackManager = CallbackManager.Factory.create();
FbCallback fbCallback = new FbCallback(this);
mLoginManager.registerCallback(mCallbackManager, fbCallback);
[...]
mLoginManager.logInWithReadPermissions(this, mPermissions);

顺便说一句......记住,用户可以撤销许可或登录时不能授予它。

By the way...remember that the user can revoke the permission or cannot grant it during the login.

阅读全文

相关推荐

最新文章