web-dev-qa-db-fra.com

Comment obtenir un jeton d'accès utilisateur facebook dans Android?

J'utilise restfb API pour accéder aux photos de mes amis en Java. Et pour accéder à ces photos, je génère le code d'accès manuellement à l'aide de Graph API Explorer et le passe en tant que paramètre à l'appel de l'API restfb.

Mais maintenant, je veux générer ce jeton d'accès via le code (par programmation). J'ai vu des exemples fb Android, en particulier un hackbook. Je ne vois pas de code d'accès généré que je puisse utiliser pour ma propre application. Dois-je créer une nouvelle application et obtenir un secret, etc.? N'hésitez pas à nous faire part de vos suggestions.

J'ai vu ces solutions ( solution-1 & solution-2 ) sur stackoverflow mais je ne suis toujours pas par où commencer?

Update-1 ::

J'utilise le code suivant pour me connecter et obtenir un jeton d'accès pour l'utilisateur connecté. Mais le problème est que cela ne fonctionne que pour le compte avec lequel j'avais créé une application sur Facebook pour générer un app_id. Il ne reçoit pas de rappel pour d'autres comptes. Toute suggestion s'il vous plaît.

Et juste au cas où vous ne savez pas par où commencer, suivez étape 6 pour créer une nouvelle application à partir de zéro.

public class MainActivity extends Activity implements OnClickListener {

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

        login = (Button) findViewById(R.id.login);
        accessToken = (TextView) findViewById(R.id.accessToken);

        login.setOnClickListener(this);
        // start Facebook Login


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

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

    @Override
    public void onResume()
    {
         Session session = Session.getActiveSession();
         if(session != null)
            if (session.isOpened()) {
                //Toast.makeText(this, session.getAccessToken(), Toast.LENGTH_LONG).show();
                accessToken = (TextView) findViewById(R.id.accessToken);
                accessToken.setText(session.getAccessToken());
                System.out.println("----------------------" + session.getAccessToken() + "---------------------");

            }
        super.onResume();
    }

    @Override
    public void onClick(View v) {
        // start Facebook Login
        Session.openActiveSession(this, true, new Session.StatusCallback() {

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

                    // make request to the /me API
                    Request.executeMeRequestAsync(session,
                            new Request.GraphUserCallback() {

                                // callback after Graph API response with user
                                // object
                                @Override
                                public void onCompleted(GraphUser user,
                                        Response response) {
                                    if (user != null) {
                                        TextView welcome = (TextView) findViewById(R.id.welcome);
                                        welcome.setText("Hello "
                                                + user.getName() + "!");
                                    }
                                }
                            });
                }
            }
        });

    }

    }
10
Junaid

La réponse à la question initiale a déjà été entrée en tant que update-1. Mais cela ne fonctionnait que pour les utilisateurs administrateurs. 

En fait, lors de la création de l'application, j'avais choisi à tort le mode "bac à sable", qui restreint l'accès de l'application uniquement aux développeurs ajoutés à la page de configuration de l'application. Ainsi, après avoir désactivé ce mode, j'ai également pu générer un jeton d'accès pour d'autres utilisateurs. 

0
Junaid

En utilisant le Kit de développement logiciel (SDK) Facebook, le meilleur moyen de gérer l'authentification de l'utilisateur consiste à utiliser la classe Session. Lorsque vous avez une instance valide de la classe Session, vous devez simplement appeler la fonction getAccessToken() afin d'obtenir la chaîne représentant le jeton d'accès.

Session session = Session.getActiveSession();
if (session != null && session.getState().isOpened()){
     Log.i("sessionToken", session.getAccessToken());
     Log.i("sessionTokenDueDate", session.getExpirationDate().toLocaleString());
}
8
5agado

J'avais le même problème avec le dernier SDK Android de Facebook (4.0.1).

J'ai utilisé AccessToken.getCurrentAccessToken () et cela a fonctionné:

    GraphRequest request = GraphRequest.newMeRequest(
            AccessToken.getCurrentAccessToken(),
            new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject jsonObject, GraphResponse response) {
                    Log.d(LOG_TAG,"onCompleted jsonObject: "+jsonObject);
                    Log.d(LOG_TAG,"onCompleted response: "+response);
                    // Application code
                }
            });
    Bundle parameters = new Bundle();
    parameters.putString("fields", "id,name,link,cover,email");
    request.setParameters(parameters);
    request.executeAsync();
8
Scott McMullan

GET /oauth/access_token? Client_id = {app-id} & Client_secret = {app-secret} & Grant_type = client_credentials

1
user3142006