37 votes

Quand à demander des autorisations avec Facebook nouveau SDK Android 3.0?

Avec Facebook nouveau kit SDK d'Android 3.0 (qui a été publié il y a quelques jours), le processus d'authentification a changé.

Alors comment faire pour demander une autorisation de lecture tels que "friends_hometown"?

Le code suivant est la façon dont je suis en train de le faire - mais je suis assez sûr que ce n'est pas la façon dont vous devriez faire ceci:

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

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

Ce que je suis en train de faire est de demander l'autorisation dès que la session est ouverte, mais à ce stade, le code est déjà à partir d'une API Graphique demande, donc la demande d'autorisation vient à la fin ...

Ne pouvez-vous pas demander une autorisation au même moment de l'initialisation de la session?

67voto

KevinM Points 1273

J'ai été en mesure de l'obtenir pour fonctionner. C'est une modification de votre Version 2 de l'échantillon. Le lien Jesse fourni également contribué à une tonne.

Voici le code que j'ai exécuté par le biais lors de l'authentification d'un utilisateur:

private void signInWithFacebook() {

    mSessionTracker = new SessionTracker(getBaseContext(), new StatusCallback() {

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

    String applicationId = Utility.getMetadataApplicationId(getBaseContext());
    mCurrentSession = mSessionTracker.getSession();

    if (mCurrentSession == null || mCurrentSession.getState().isClosed()) {
        mSessionTracker.setSession(null);
        Session session = new Session.Builder(getBaseContext()).setApplicationId(applicationId).build();
        Session.setActiveSession(session);
        mCurrentSession = session;
    }

    if (!mCurrentSession.isOpened()) {
        Session.OpenRequest openRequest = null;
        openRequest = new Session.OpenRequest(SignUpChoices.this);

        if (openRequest != null) {
            openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS);
            openRequest.setPermissions(Arrays.asList("user_birthday", "email", "user_location"));
            openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);

            mCurrentSession.openForRead(openRequest);
        }
    }else {
        Request.executeMeRequestAsync(mCurrentSession, new Request.GraphUserCallback() {
              @Override
              public void onCompleted(GraphUser user, Response response) {
                  Log.w("myConsultant", user.getId() + " " + user.getName() + " " + user.getInnerJSONObject());
              }
            });
    }
}

Pour les tests, j'ai couru à travers le code ci-dessous après le retour de Facebooks d'authentification:

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

  if (mCurrentSession.isOpened()) {
    Request.executeMeRequestAsync(mCurrentSession, new Request.GraphUserCallback() {

          // callback after Graph API response with user object
          @Override
          public void onCompleted(GraphUser user, Response response) {
              Log.w("myConsultant", user.getId() + " " + user.getName() + " " + user.getInnerJSONObject());
          }
        });
    }
}

55voto

Pedro Oliveira Points 816

J'ai résolu le même problème par la mise en œuvre de mon propre Session.openActiveSession() méthode:

private static Session openActiveSession(Activity activity, boolean allowLoginUI, StatusCallback callback, List<String> permissions) {
    OpenRequest openRequest = new OpenRequest(activity).setPermissions(permissions).setCallback(callback);
    Session session = new Builder(activity).build();
    if (SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) {
        Session.setActiveSession(session);
        session.openForRead(openRequest);
        return session;
    }
    return null;
}

16voto

Jesse Chen Points 4580

Je vous recommande de lire notre tutoriel de connexion ici plus précisément à l'étape 3. En utilisant le bouton de connexion que nous offrons est la méthode la plus pratique, (voir authButton.setReadPermissions())

EDIT:

Pour définir des autorisations sans l'aide de la loginbutton est un peu plus compliquée car vous aurez à faire tout de la session de gestion à la main. Creuser dans le code source pour le bouton de connexion, cette ligne de code est probablement ce que vous avez besoin. Il semble que vous aurez besoin pour créer votre propre Session.OpenRequest et l'ensemble des attributs tels que les autorisations, les spectateurs, et le comportement de connexion, puis obtenir la session en cours et l'appel en openForRead() sur votre Session.OpenRequest.

4voto

sromku Points 2603

Bien que la première question a été posée à il ya quelques mois et il est accepté réponses, il y a une autre solution plus élégante pour demander plus d'autorisations de l'utilisateur pendant l'authentification. En outre, Facebook SDK 3.5 a été publié récemment, et il serait bon d'actualiser ce thread :)

Donc, la solution élégante est livré avec cette bibliothèque open source: android-simple-facebook

Le programme d'installation

Juste ajouter les lignes suivantes dans votre Activity classe:

  1. Définir et sélectionner les autorisations dont vous avez besoin, comme friends_hometown:

    Permissions[] permissions = new Permissions[]
    {
        Permissions.FRIENDS_HOMETOWN,
        Permissions.FRIENDS_PHOTOS,
        Permissions.PUBLISH_ACTION
    };
    

    La grande chose ici avec les autorisations, c'est que vous n'avez pas besoin de séparer les LIRE et les autorisations de publication. Vous venez de mentionner ce que vous avez besoin et de la bibliothèque prend en charge le reste.

  2. Construire et définir la configuration en mettant app_id, namespace et permissions:

    SimpleFacebookConfiguration configuration = new SimpleFacebookConfiguration.Builder()
            .setAppId("625994234086470")
            .setNamespace("sromkuapp")
            .setPermissions(permissions)
            .build();
    
  3. Et, de créer SimpleFacebook de l'instance et de définir cette configuration:

    SimpleFacebook simpleFacebook = SimpleFacebook.getInstance(Activity);
    simpleFacebook.setConfiguration(configuration);
    

Maintenant, vous pouvez exécuter les méthodes comme: login, publier des aliments/histoire, inviter,...

Connexion

mSimpleFacebook.login(OnLoginListener);

Déconnexion

mSimpleFacebook.logout(OnLogoutListener);

Pour plus d'exemples d'utilisation et de consulter cette page: https://github.com/sromku/android-simple-facebook#actions-examples

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X