it-swarm.com.de

Wie überprüfe ich, ob ein Benutzer mit FB SDK 4.0 für Android angemeldet ist?

Vor ein paar Tagen habe ich FB Login in meine APP implementiert und heute habe ich herausgefunden, dass die meisten Dinge, die ich implementiert habe, jetzt veraltet sind.

Früher habe ich Session verwendet, um festzustellen, ob der Benutzer angemeldet war oder nicht. Mit dem neuen SDK funktioniert dies jedoch nicht.

Ihren Dokumenten zufolge können wir AccessToken.getCurrentAccessToken() und Profile.getCurrentProfile() verwenden, um zu überprüfen, ob der Benutzer bereits angemeldet ist, aber ich konnte diese nicht verwenden.

Ich habe so etwas ausprobiert:

if(AccessToken.getCurrentAccessToken() == null)

Ich frage mich, ob das funktionieren würde, wenn ich es innerhalb dieses (der auch von FB bereitgestellt wird) verwenden könnte:

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

Ich erhalte jedoch ein "Symbol 'Rückruf' kann nicht aufgelöst werden".

EDIT !!!!!!

Also gut, ich konnte überprüfen, ob der Benutzer angemeldet ist, indem ich Folgendes verwendete:

On onCreate:

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

Dann ruft das meine updateWithToken Methode auf:

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

            LOAD ACTIVITY A!

    } else {

            LOAD ACTIVITY B!
    }
}

Das Problem ist nun: Wenn der Benutzer die Anwendung verwendet und sich noch nicht angemeldet hat, kann ich das überprüfen! Wenn der Benutzer die App jedoch zum ersten Mal verwendet, wird updateWithToken von meinem AccessTokenTracker nie aufgerufen.

Ich würde mich sehr freuen, wenn jemand helfen könnte.

Vielen Dank!

64
Felipe

Ich habe es verstanden!

Stellen Sie zunächst sicher, dass Sie Ihr FB SDK initialisiert haben. Zweitens fügen Sie Folgendes hinzu:

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

Dies wird aufgerufen, wenn sich die aktuellen Zugriffstoken ändern. Das heißt, dies hilft Ihnen nur, wenn der Benutzer bereits angemeldet ist.

Als Nächstes fügen wir dies unserer onCreate() -Methode hinzu:

updateWithToken(AccessToken.getCurrentAccessToken());

Dann natürlich unsere updateWithToken() Methode:

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

Das hat es für mich getan! =]

35
Felipe

Für meinen Fall hat sich eine viel einfachere Lösung bewährt (ich weiß jedoch nicht, ob dies der elegantere Weg ist):

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

Mein Dilemma bei der Verwendung von AccessToken und AccessTokenTracker zur Überprüfung des Anmeldestatus ist, dass wenn AccessToken bereit ist und die Rückruffunktion des aufgerufenen Trackers möglicherweise noch nicht bereit ist, der Name von Facebook in diesem Moment nicht abgerufen oder angezeigt werden kann.

Meine Lösung besteht darin, das aktuelle Profil zu überprüfen! = Null und seinen Tracker zu verwenden, um den Namen von Facebook gleichzeitig zu haben:

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

Überprüfen Sie den Anmeldestatus und rufen Sie den Benutzernamen ab:

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

Sie können die gleiche Methode verwenden, die Felipe in seiner Antwort erwähnt hat, oder Sie können die beiden anderen Methoden verwenden. Es scheint jedoch, dass AccessTokenTracker der bequeme Weg ist, da es Ihnen hilft, die Zugriffstoken zu verfolgen (Verwendung mit der ProfileTracker-Klasse).

  1. Wenn Sie eine benutzerdefinierte Schaltfläche für Ihre Anmeldung verwenden, rufen Sie LoginManager zurück

Beispielsweise

In Ihrem Layout xml

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

In deiner Aktivität

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

Klicken Sie auf die Schaltfläche Listener

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

Am Ende der LoginManager Callback

 //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. Wenn Sie die im SDK bereitgestellte Schaltfläche (com.facebook.login.widget.LoginButton) verwenden, verwenden Sie den LoginButton-Rückruf (siehe Referenzdokument - https: //developers.facebook.com/docs/facebook) -login/Android/v2.3 )

Beispielsweise

In Ihrem Layout 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"/>

In Ihrer Tätigkeit

    //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());
        }
    });

Vergessen Sie nicht, callbackManager.onActivityResult(requestCode, resultCode, data); in Ihrer Activity onActivityResult () aufzurufen.

3
binary

Laut Facebook-Dokumentation können Sie dies tun, indem Sie:

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

Es ist spät zu antworten, aber jetzt in der Version 4.25.0 von Facebook SDK es gibt eine Methode:

public void retrieveLoginStatus(Context context,
                                LoginStatusCallback responseCallback)

Welche Staaten:

Ruft den Anmeldestatus für den Benutzer ab. Dies gibt ein Zugriffstoken für die App zurück, wenn ein Benutzer bei Facebook für Android App auf demselben Gerät angemeldet ist und dieser Benutzer sich zuvor bei der App angemeldet hat. Wenn ein Zugriffstoken abgerufen wurde, dann Es wird ein Toast angezeigt, der dem Benutzer mitteilt, dass er angemeldet ist.

Und kann verwendet werden wie:

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