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 à mon application, et aujourd'hui j'ai découvert que la plupart des choses que j'ai implémentées sont maintenant obsolètes.

Avant, 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 faire usage de ceux-ci.

J'ai essayé quelque chose comme ceci:

if(AccessToken.getCurrentAccessToken() == null)

Je me demande si ce serait travailler si je pouvais l'utiliser à l'intérieur de ceci (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'".

Modifier!!!!!!

D'accord, j'ai donc pu vérifier si l'utilisateur est connecté en utilisant ce qui suit:

Sur 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: Si l'utilisateur a utilisé l'application et n'a enregistré en avant, je peux vérifier que! 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 que quelqu'un puisse aider.

Merci!

57
demandé sur Felipe 2015-03-27 08:38:18

6 réponses

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;
}
128
répondu Felipe Mosso 2015-05-05 01:16:03

Je l'ai!

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

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

Cela sera appelé quand il y a un changement sur les Tokes 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());

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

Ça l'a fait pour moi! =]

33
répondu Felipe 2015-03-27 17:26:12

Mon dilemme d'utiliser AccessToken et AccessTokenTracker pour vérifier l'état de connexion est que lorsque AccessToken est prêt et la fonction de rappel du tracker appelé, mais le profil peut ne pas être encore prêt, donc je ne peux pas obtenir ou afficher le nom de Facebooker à ce moment.

Ma solution est de vérifier le profil actuel != null et utiliser son tracker pour avoir le nom de Facebooker en même temps:

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

Vérifiez l'état de connexion, puis obtenez le nom d'utilisateur:

Profile profile = Profile.getCurrentProfile();
if (profile != null) {
    Log.v(TAG, "Logged, user name=" + profile.getFirstName() + " " + profile.getLastName());
}
8
répondu Tony 2015-11-28 02:42:45

Vous pouvez utiliser la même manière que Felipe mentionné dans sa réponse ou vous pouvez utiliser les deux autres façons. Mais il semble que AccessTokenTracker soit le 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 utiliser LoginManager de retour d'appel

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 Auditeur

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

À la fin de la Rappel 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.connexion.widget.LoginButton) fourni dans le SDK utilise le rappel LoginButton (ceci est crealy détaillé dans leur référence doc - https://developers.facebook.com/docs/facebook-login/android/v2.3 )

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
répondu binary 2015-03-29 09:37:16

Son tard pour répondre, mais maintenant, dans la version 4.25.0 de Facebook SDK il existe une méthode:

public void retrieveLoginStatus(Context context,
                                LoginStatusCallback responseCallback)

Qui dit:

Récupère l'état de connexion de l'utilisateur. Cela renverra un accès jeton pour l'application si un utilisateur est connecté à Facebook pour Android app sur le même appareil et que l'utilisateur avait déjà connecté à la App. Si un jeton d'accès a été récupéré un toast sera affiché en indiquant à l'utilisateur qu'ils ont été enregistrés dans.

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
répondu Talha 2017-07-31 07:48:33

Selon la documentation facebook vous pouvez le faire par:

AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
0
répondu Asad 2018-07-18 11:55:51