¿Cuándo solicitar permisos con el nuevo Android SDK 3.0 de Facebook?

Con el nuevo Android SDK 3.0 de Facebook (que se lanzó hace unos días), el proceso de autenticación ha cambiado.

Entonces, ¿cómo solicitas un permiso de lectura como "friends_hometown"?

El siguiente código es cómo intento hacerlo, pero estoy seguro de que no es la forma en que debes hacerlo:

Versión 1:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Session.openActiveSession(this, true, new Session.StatusCallback() { // start Facebook login
        @Override
        public void call(Session session, SessionState state, Exception exception) { // callback for session state changes
            if (session.isOpened()) {
                List<String> permissions = new ArrayList<String>();
                permissions.add("friends_hometown");
                session.requestNewReadPermissions(new Session.NewPermissionsRequest(FBImport.this, permissions));
                Request.executeGraphPathRequestAsync(session, "me/friends/?access_token="+session.getAccessToken()+"&fields=id,name,hometown", new Request.Callback() {
                    ...
                });
            }
        }
    });
}

Versión 2:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Session currentSession = Session.getActiveSession();
    if (currentSession == null || currentSession.getState().isClosed()) {
        Session session = Session.openActiveSession(this, true, fbStatusCallback); // PROBLEM: NO PERMISSIONS YET BUT CALLBACK IS EXECUTED ON OPEN
        currentSession = session;
    }
    if (currentSession != null && !currentSession.isOpened()) {
        OpenRequest openRequest = new OpenRequest(this).setCallback(fbStatusCallback); // HERE IT IS OKAY TO EXECUTE THE CALLBACK BECAUSE WE'VE GOT THE PERMISSIONS
        if (openRequest != null) {
            openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS);
            openRequest.setPermissions(Arrays.asList("friends_hometown"));
            openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
            currentSession.openForRead(openRequest);
        }
    }
}

Lo que estoy haciendo es solicitar el permiso tan pronto como la sesión esté abierta, pero en este punto el código ya está iniciando una solicitud de Graph API, por lo que la solicitud de permiso llega tarde ...

¿No puede solicitar un permiso al mismo tiempo que inicializa la sesión?

Respuestas a la pregunta(2)

Su respuesta a la pregunta