Facebook onCompleted Email java.lang.NullPointerException

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

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

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

Раньше я использовал этот источник для получения информации о пользователе Facebook и без проблем получал данные (включая электронную почту):

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() {
        ....
    }

}

И теперь я использую тот же код в одном из моих проектов, но всегда получаю:

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();

Код:

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();
        }
    }
}

В чем может быть причина? Почему это происходит?

Ответ 1

Иногда может случиться так, что Пользователь не установит свой идентификатор электронной почты в своем профиле, который вы получаете в своем Facebook-подключении через Android, чтобы вызывать ошибку, например, исключение Null Pointer.

Так что вам нужно проверить перед использованием переменной электронной почты после извлечения из Login, что она равна null или нет. Например:

String email ="";
if(user.asMap().get("email") != null){
 email = user.asMap().get("email").toString();
}

Ответ 2

Вам нужно добавить "адрес электронной почты" в список разрешений, которые вам требуются, в противном случае адрес электронной почты всегда будет нулевым. Я не знаю, какую версию sdk вы используете. С последним вы можете написать:

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);

Кстати... помните, что пользователь может аннулировать разрешение или не может предоставить его во время входа.