Jak sprawdzić, czy użytkownik jest zalogowany za pomocą FB SDK 4.0 Dla Androida?

Kilka dni temu zaimplementowałem FB Login do mojej aplikacji, a dziś dowiedziałem się, że większość rzeczy, które zaimplementowałem, jest obecnie przestarzała.

Wcześniej używałem Session, aby sprawdzić, czy użytkownik jest zalogowany, czy nie. Jednak to nie działa z nowym SDK.

Zgodnie z ich dokumentami, możemy użyć AccessToken.getCurrentAccessToken() i Profile.getCurrentProfile(), aby sprawdzić, czy użytkownik jest już zalogowany, ale nie mogłem z nich skorzystać.

Próbowałem czegoś takiego:

if(AccessToken.getCurrentAccessToken() == null)

Zastanawiam się, czy to praca, jeśli mogę go użyć wewnątrz tego (który jest również dostarczany przez FB):

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

Jednak dostaję "Nie można rozwiązać symbolu 'Callback'".

Edycja!!!!!!

W porządku, więc byłem w stanie sprawdzić, czy użytkownik jest zalogowany za pomocą następujących:

On-line:

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

Wtedy, to wywołuje moją metodę updateWithToken:

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

            LOAD ACTIVITY A!

    } else {

            LOAD ACTIVITY B!
    }
}

Teraz problem polega na tym, że jeśli użytkownik korzystał z aplikacji i nie zalogował się wcześniej, mogę sprawdzić, czy to! Ale jeśli jest to pierwszy raz, że użytkownik korzysta z aplikacji, {[7] } nigdy nie jest wywoływany przez mój AccessTokenTracker.

Byłbym wdzięczny, gdyby ktoś mógł pomóc. Dzięki!
Author: Felipe, 2015-03-27

6 answers

Dużo prostsze rozwiązanie zadziałało w mojej sprawie (Nie wiem, czy to jest bardziej elegancki sposób):

public boolean isLoggedIn() {
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    return accessToken != null;
}
 128
Author: Felipe Mosso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 01:16:03

Mam!

Najpierw upewnij się, że zainicjowałeś FB SDK. Po drugie, dodać:

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

Zostanie wywołana, gdy nastąpi zmiana bieżącego dostępu do Oznacza to, że pomoże Ci to tylko wtedy, gdy użytkownik jest już zalogowany.

Następnie dodajemy to do naszej metody onCreate():

updateWithToken(AccessToken.getCurrentAccessToken());

Wtedy oczywiście nasza metoda 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);
    }
}
To mi się udało! =]
 33
Author: Felipe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-27 17:26:12

Mój dylemat korzystania z AccessToken i AccessTokenTracker do sprawdzania stanu logowania jest to, że gdy AccessToken jest gotowy i funkcja callback o nazwie Trackera, ale profil może nie być jeszcze gotowy, więc nie mogę uzyskać lub wyświetlić nazwy Facebookera w tym momencie.

Moim rozwiązaniem jest sprawdzenie bieżącego profilu != null i używać jego trackera do posiadania nazwy Facebookera w tym samym czasie:

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

Sprawdź status logowania, a następnie uzyskaj nazwę użytkownika:

Profile profile = Profile.getCurrentProfile();
if (profile != null) {
    Log.v(TAG, "Logged, user name=" + profile.getFirstName() + " " + profile.getLastName());
}
 8
Author: Tony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-28 02:42:45

Możesz użyć tego samego sposobu, o którym wspomniał Felipe w swojej odpowiedzi, lub pozostałych dwóch sposobów. Ale wydaje się, że AccessTokenTracker jest wygodnym sposobem, ponieważ pomaga śledzić tokeny dostępu (użyj Z klasą ProfileTracker)

  1. Jeśli używasz niestandardowego przycisku do logowania, użyj LoginManager call back

Na przykład

W twoim układzie XML

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

W Twojej aktywności

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

Przycisk onclick Listener

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

Na końcu 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. Jeśli używasz przycisku (kom.facebook.login.widget.LoginButton) dostarczony w SDK używa wywołania zwrotnego LoginButton (jest to szczegółowo opisane w ich referencji doc - https://developers.facebook.com/docs/facebook-login/android/v2.3 )

Na przykład

W twoim układzie 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"/>

W Twojej aktywności

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

Nie zapomnij wywołać callbackManager.onActivityResult(requestCode, resultCode, data); w swojej aktywności onActivityResult ()

 3
Author: binary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-29 09:37:16

Późno na odpowiedź, ale teraz w wersji 4.25.0 z {[3] } istnieje metoda:

public void retrieveLoginStatus(Context context,
                                LoginStatusCallback responseCallback)

Który stwierdza:

Pobiera status logowania dla użytkownika. To zwróci dostęp token dla aplikacji, Jeśli użytkownik jest zalogowany na Facebook dla Androida aplikacji na tym samym urządzeniu i że użytkownik wcześniej zalogował się do app. Jeśli zostanie pobrany token dostępu, zostanie wyświetlony toast informowanie użytkownika, że został zalogowany.

I może być używane jak:

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
Author: Talha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-31 07:48:33

Zgodnie z Dokumentacja facebook możesz to zrobić przez:

AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
 0
Author: Asad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 11:55:51