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