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!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;
}
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! =]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());
}
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)
- 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");
}
});
- 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 ()
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();
}
} );
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();
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