demander de nouvelles autorisations de lecture dans la connexion de l'application fb android

J'ai ce problème simple: J'essaie d'implémenter une connexion simple avec FB SDK 3.5 sur android. J'ai besoin que l'utilisateur clique sur un bouton normal (pas FBLoginButton) et obtienne l'email.

Jusqu'à présent, je peux gérer la connexion avec les autorisations de base fournies par FB SDK, mais je ne suis pas en mesure de demander des autorisations supplémentaires à l'utilisateur.

J'ai lu ces réponses sur StackOverflow:

J'ai lu ce tutoriel sur les pages FB:

Jusqu'à présent, j'ai ce code "travail" UNIQUEMENT pour les informations de base (informations par défaut fournies par FB).

FacebookLogin.activity

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


        pref = setApplicationContext().getSharedPreferences(MainActivity.SHARED_PREFERENCES, 0);//0 for private mode

         if (internetConnection()) {

           //start Facebook Login
            Session.openActiveSession(this, true, new Session.StatusCallback() {            

             //callback when session changes state
              @Override       
              public void call(final Session session, SessionState state, Exception exception) {


              if (session.isOpened()) {


                **// TRYING TO ADD NEW PERMISSIONS but doesn't work**
                Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(FacebookLogin.this, **PERMISSIONS**);
                session.requestNewReadPermissions(newPermissionsRequest);           




               //riquest /me API                
                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) { 

                      Editor pref_editor = pref.edit();

                     //token
                      pref_editor.putString(PREF_FB_ACCESS_TOKEN, session.getAccessToken());

                     //DEBUG
                      Log.i(LOG_ACTIVITY, "FB_token: "+session.getAccessToken());
                      Log.i(LOG_ACTIVITY, "FB_permissions: "+ session.getPermissions());

                     //user_id                     
                      pref_editor.putString(PREF_FB_USER_ID, user.getId());

                     //email
                      //pref_editor.putString(PREF_FB_USER_EMAIL,);


                     pref_editor.commit(); 
                  }
                }
              }).executeAsync();

                 Intent intent = new Intent(FacebookLogin.this, AfterLogin.class);
                 intent.putExtra(LOGIN_ORIGIN, "facebook");
                 startActivity(intent);
                 finish();

            }


            if (session.isClosed()){

               //do nothing.FB call to FBapp

            }         
          }
        }); 


        }       

        else {


            Toast.makeText(getApplicationContext(), "error: no internet", Toast.LENGTH_SHORT).show();


            Intent intent = new Intent(FacebookLogin.this, MainActivity.class);
            startActivity(intent);
            finish();
        }
    }

J'ai aussi la méthode onActivityResult dans la classe/activité

     @Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);          

          Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
      } 



Is there someone that knows how to fix it? Thanks in advance.

0
Je ne sais pas où vérifier les informations que vous demandez, j'utilise logcat uniquement pour voir mes informations de débogage. Aussi je peux voir la nouvelle boîte de dialogue de demande d'autorisation mais je n'ai pas le temps d'appuyer sur le bouton "ok", alors il passe à l'activité suivante comme il se doit. Mais si je vérifie le jeton avec token_debugger sur la plateforme FB, je ne vois que les permissions de base (identifiant, nom, etc.) et non celles que j'ai demandées.
ajouté l'auteur shaolin, source
Y a-t-il quelque chose dans logcat? Quel est le comportement que vous voyez lorsque vous demandez des autorisations supplémentaires?
ajouté l'auteur Ming Li, source

1 Réponses

Finally problem solved in this way. Hope it can be useful for someone.
Inside my activity:

private Session.StatusCallback statusCallback = new   SessionStatusCallback ();


onCreate() or onClick() of some button

Session.openActiveSession (MainActivity.this, true, statusCallback);


In the activiy I need to put this class:

private class SessionStatusCallback implements Session.StatusCallback{


    @Override
    public void call(Session session, SessionState state, Exception exception){
       //response to session changes
        Toast.makeText(MainActivity.this, "chiamata FB call", Toast.LENGTH_SHORT).show();

        if(session.isOpened()) {
            /// debug
            Log.i(LOG_ACTIVITY,"..session opened..ask for additional permissions");


           //additional permissions
            List permissions = Arrays.asList("email, user_about_me, user_likes");
            Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(MainActivity.this, permissions);
            session.requestNewReadPermissions(newPermissionsRequest);

            //debug             
            Log.i(LOG_ACTIVITY,"..token:"+ session.getAccessToken());



           //request data
            Request.newMeRequest(session, new Request.GraphUserCallback() {

                @Override
                public void onCompleted(GraphUser user, Response response) {
                    if(user != null){
                        Toast.makeText(MainActivity.this, "ciao "+user.getName(), Toast.LENGTH_SHORT).show();
                    }

                }


            });

        }

   //check permissions
        List fb_permissions = session.getPermissions();
        if ( fb_permissions.contains("email")){

           //new permission ok, go to next activity
            Intent intent = new Intent (MainActivity.this, AfterLogin.class);
            startActivity(intent);
            finish();
        }

        else{
           //display toast
            Toast.makeText(MainActivity.this, "problems with permsissions..", Toast.LENGTH_SHORT).show();
        }

    }
}

Et aussi cette méthode:

public void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(MainActivity.this, requestCode, resultCode, data);
    }



And then it works. But I still don't know how to handle the errors or if the user doesn't accept the permissions. Anyway thanks for the support and hope my work can be useful to someone.

N'oubliez pas d'enregistrer l'activité comme indiqué dans la page Facebook du développeur (fichier manifest), ainsi que sur l'application Facebook remplissant les champs du package et du nom de l'activité.

0
ajouté