web-dev-qa-db-fra.com

Comment vérifier si l'utilisateur est connecté avec FB SDK 4.0 pour Android?

Il y a quelques jours, j'ai implémenté FB Login sur mon APP et j'ai découvert aujourd'hui que la plupart des choses que j'ai implémentées sont maintenant obsolètes.

Auparavant, j'utilisais Session pour voir si l'utilisateur était connecté ou non. Cependant, cela ne fonctionne pas avec le nouveau SDK.

Selon leur documentation, nous pouvons utiliser AccessToken.getCurrentAccessToken() et Profile.getCurrentProfile() pour vérifier si l'utilisateur est déjà connecté, mais je ne pouvais pas les utiliser.

J'ai essayé quelque chose comme ça:

if(AccessToken.getCurrentAccessToken() == null)

Je me demande si cela fonctionnerait si je pouvais l'utiliser à l'intérieur de celui-ci (qui est également fourni par FB):

LoginManager.getInstance().registerCallback(callbackManager, new LoginManager.Callback() {...});

Cependant, je reçois un "Impossible de résoudre le symbole 'Callback'".

EDIT !!!!!!

Bon, j'ai donc pu vérifier si l'utilisateur est connecté en utilisant les éléments suivants:

On onCreate:

accessTokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
            updateWithToken(newAccessToken);
        }
    };

Ensuite, cela appelle ma méthode updateWithToken:

private void updateWithToken(AccessToken currentAccessToken) {
    if (currentAccessToken != null) {

            LOAD ACTIVITY A!

    } else {

            LOAD ACTIVITY B!
    }
}

Maintenant, le problème est le suivant: si l'utilisateur a utilisé l'application et ne s'est pas connecté auparavant, je peux vérifier cela! Mais si c'est la première fois que l'utilisateur utilise l'application, updateWithToken n'est jamais appelé par mon AccessTokenTracker.

J'apprécierais vraiment si quelqu'un pouvait aider.

Merci!

64
Felipe

J? ai compris!

Tout d’abord, assurez-vous d’avoir initialisé votre SDK FB. Deuxièmement, ajoutez ce qui suit:

accessTokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
            updateWithToken(newAccessToken);
        }
    };

Cela sera appelé quand il y aura un changement sur les jetons d'accès actuels. Cela signifie que cela ne vous aidera que si l'utilisateur est déjà connecté.

Ensuite, nous ajoutons ceci à notre méthode onCreate():

updateWithToken(AccessToken.getCurrentAccessToken());

Ensuite, bien sûr, notre méthode updateWithToken():

private void updateWithToken(AccessToken currentAccessToken) {

    if (currentAccessToken != null) {
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                Intent i = new Intent(SplashScreen.this, GeekTrivia.class);
                startActivity(i);

                finish();
            }
        }, SPLASH_TIME_OUT);
    } else {
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                Intent i = new Intent(SplashScreen.this, Login.class);
                startActivity(i);

                finish();
            }
        }, SPLASH_TIME_OUT);
    }
}

Cela l'a fait pour moi! =]

35
Felipe

Une solution beaucoup plus simple a fonctionné pour mon cas (je ne sais pas si c'est la manière la plus élégante cependant):

public boolean isLoggedIn() {
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    return accessToken != null;
}
137
Felipe Mosso

Mon dilemme d'utilisation d'AccessToken et AccessTokenTracker pour vérifier l'état de connexion est que lorsque AccessToken est prêt et que la fonction de rappel du suivi est appelée mais que le profil n'est peut-être pas encore prêt, je ne peux ni obtenir ni afficher le nom de Facebook à ce moment.

Ma solution est de vérifier le profil actuel! = Null et d'utiliser son traqueur pour avoir le nom de Facebook en même temps:

    ProfileTracker fbProfileTracker = new ProfileTracker() {
        @Override
        protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
            // User logged in or changed profile
        }
    };

Vérifiez le statut de connexion et obtenez le nom d'utilisateur:

Profile profile = Profile.getCurrentProfile();
if (profile != null) {
    Log.v(TAG, "Logged, user name=" + profile.getFirstName() + " " + profile.getLastName());
}
9
Tony

Vous pouvez utiliser la même manière que Felipe a mentionné dans sa réponse ou vous pouvez utiliser les deux autres manières. Mais il semble qu'AccessTokenTracker soit un moyen pratique, car il vous aide à suivre les jetons d'accès (à utiliser avec la classe ProfileTracker)

  1. Si vous utilisez un bouton personnalisé pour votre connexion, utilisez LoginManager pour rappeler

Par exemple

Dans votre mise en page xml

    <Button
        Android:id="@+id/my_facebook_button"
        Android:background="@drawable/btnfacebook"
        Android:onClick="facebookLogin"/>

Dans votre activité

    //Custom Button
    Button myFacebookButton = (Button) findViewById(R.id.my_facebook_button);

Le bouton onclick Listener

public void facebookLogin(View view) {
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends"));
    }

À la fin du rappel de LoginManager

 //Create callback manager to handle login response
        CallbackManager callbackManager = CallbackManager.Factory.create();

       LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
           @Override
           public void onSuccess(LoginResult loginResult) {
               Log.i(TAG, "LoginManager FacebookCallback onSuccess");
               if(loginResult.getAccessToken() != null) {
                   Log.i(TAG, "Access Token:: " + loginResult.getAccessToken());
                   facebookSuccess();
               }
           }

           @Override
           public void onCancel() {
               Log.i(TAG, "LoginManager FacebookCallback onCancel");
           }

           @Override
           public void onError(FacebookException e) {
               Log.i(TAG, "LoginManager FacebookCallback onError");
           }
       });
  1. Si vous utilisez le bouton (com.facebook.login.widget.LoginButton) fourni dans le kit de développement logiciel (SDK), utilisez le rappel LoginButton (celui-ci est détaillé dans leur document de référence - https://developers.facebook.com/docs/facebook -login/Android/v2. )

Par exemple

Dans votre mise en page xml

<com.facebook.login.widget.LoginButton
                Android:id="@+id/login_button"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_gravity="center_horizontal"/>

Dans votre activité

    //Facebook SDK provided LoginButton
    LoginButton loginButton = (LoginButton) findViewById(R.id.login_button);
    loginButton.setReadPermissions("user_friends");
    //Callback registration
    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            // App code
            Log.i(TAG, "LoginButton FacebookCallback onSuccess");
            if(loginResult.getAccessToken() != null){
                Log.i(TAG, "Access Token:: "+loginResult.getAccessToken());
                facebookSuccess();
            }

        }

        @Override
        public void onCancel() {
            // App code
            Log.i(TAG, "LoginButton FacebookCallback onCancel");
        }

        @Override
        public void onError(FacebookException exception) {
            // App code
            Log.i(TAG, "LoginButton FacebookCallback onError:: "+exception.getMessage());
            Log.i(TAG,"Exception:: "+exception.getStackTrace());
        }
    });

N'oubliez pas d'appeler callbackManager.onActivityResult(requestCode, resultCode, data); dans votre activité onActivityResult ()

3
binary

Selon documentation facebook vous pouvez le faire en:

AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
3
Asad

Il est tard pour répondre, mais maintenant dans la version 4.25.0 de Facebook SDK il y a une méthode:

public void retrieveLoginStatus(Context context,
                                LoginStatusCallback responseCallback)

Quels États:

Récupère le statut de connexion de l'utilisateur. Cela renverra un jeton d'accès à l'application si un utilisateur est connecté à Facebook pour Android app sur le même appareil et que cet utilisateur était déjà connecté à l'application. Si un jeton d'accès a été récupéré, un toast sera montré indiquant à l'utilisateur qu'il a été connecté.

Et peut être utilisé comme:

LoginManager.getInstance().retrieveLoginStatus( this, new LoginStatusCallback()
{
    @Override
    public void onCompleted( AccessToken accessToken )
    {
        GraphRequest request = GraphRequest.newMeRequest( accessToken, new GraphRequest.GraphJSONObjectCallback()
        {
            @Override
            public void onCompleted( JSONObject object, GraphResponse response )
            {
                Log.e( TAG, object.toString() );
                Log.e( TAG, response.toString() );

                try
                {
                    userId = object.getString( "id" );
                    profilePicture = new URL( "https://graph.facebook.com/" + userId + "/picture?width=500&height=500" );
                    Log.d( "PROFILE_URL", "url: " + profilePicture.toString() );
                    if ( object.has( "first_name" ) )
                    {
                        firstName = object.getString( "first_name" );
                    }
                    if ( object.has( "last_name" ) )
                    {
                        lastName = object.getString( "last_name" );
                    }
                    if ( object.has( "email" ) )
                    {
                        email = object.getString( "email" );
                    }
                    if ( object.has( "birthday" ) )
                    {
                        birthday = object.getString( "birthday" );
                    }
                    if ( object.has( "gender" ) )
                    {
                        gender = object.getString( "gender" );
                    }

                    Intent main = new Intent( LoginActivity.this, MainActivity.class );
                    main.putExtra( "name", firstName );
                    main.putExtra( "surname", lastName );
                    main.putExtra( "imageUrl", profilePicture.toString() );
                    startActivity( main );
                    finish();
                }
                catch ( JSONException e )
                {
                    e.printStackTrace();
                }
                catch ( MalformedURLException e )
                {
                    e.printStackTrace();
                }

            }
        } );
        //Here we put the requested fields to be returned from the JSONObject
        Bundle parameters = new Bundle();
        parameters.putString( "fields", "id, first_name, last_name, email, birthday, gender" );
        request.setParameters( parameters );
        request.executeAsync();
    }

    @Override
    public void onFailure()
    {
        Toast.makeText( LoginActivity.this, "Could not log in.", Toast.LENGTH_SHORT ).show();
    }

    @Override
    public void onError( Exception exception )
    {
        Toast.makeText( LoginActivity.this, "Could not log in.", Toast.LENGTH_SHORT ).show();
    }
} );
1
Talha