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!
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;
}
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! =]
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());
}
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)
- 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");
}
});
- 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()
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();
}
} );
Selon la documentation facebook vous pouvez le faire par:
AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();