Как проверить, если пользователь вошел в систему с FB SDK 4.0 для Android?
несколько дней назад я реализовал вход FB в свое приложение, и сегодня я узнал, что большинство вещей, которые я реализовал, теперь устарели.
раньше я использовал Session чтобы увидеть, если пользователь вошел в систему или нет. Однако, это не работает с новым SDK.
согласно их документам, мы можем использовать AccessToken.getCurrentAccessToken() и Profile.getCurrentProfile() чтобы проверить, если пользователь уже вошел в систему, но я не мог воспользоваться этим.
Я пробовал что-то вроде этого:
if(AccessToken.getCurrentAccessToken() == null)
интересно, будет ли это работать, если я смогу использовать его внутри этого (что также предусмотрено FB):
LoginManager.getInstance().registerCallback(callbackManager, new LoginManager.Callback() {...});
однако, я получаю "не удается разрешить символ 'обратный вызов'".
редактировать!!!!!!
хорошо, поэтому я смог проверить, если пользователь вошел в систему, используя следующее:
On onCreate:
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
updateWithToken(newAccessToken);
}
};
тогда, что зовет меня updateWithToken метод:
private void updateWithToken(AccessToken currentAccessToken) {
if (currentAccessToken != null) {
LOAD ACTIVITY A!
} else {
LOAD ACTIVITY B!
}
}
теперь проблема: если пользователь использовал приложение и не вошел в систему раньше, я могу проверить это! Но если это первый раз, когда пользователь использует приложение, updateWithToken никогда не вызывается моим AccessTokenTracker.
Я был бы очень признателен, если бы кто-то мог помочь.
спасибо!
6 ответов:
гораздо более простое решение работало для моего случая (я не знаю, если это более элегантный способ, хотя):
public boolean isLoggedIn() { AccessToken accessToken = AccessToken.getCurrentAccessToken(); return accessToken != null; }
я понял!
во-первых, убедитесь, что вы инициализировали свой FB SDK. Во-вторых, добавить следующее:
accessTokenTracker = new AccessTokenTracker() { @Override protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) { updateWithToken(newAccessToken); } };это будет вызвано, когда есть изменения в текущем доступе к kes. Это означает, что это поможет вам только в том случае, если пользователь уже вошел в систему.
Далее мы добавим это к нашему
onCreate()способ:updateWithToken(AccessToken.getCurrentAccessToken());тогда, конечно, наш!--4--> способ:
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); } }Это сделало это для меня! =]
моя дилемма использования AccessToken и AccessTokenTracker для проверки статуса входа заключается в том, что когда AccessToken готов и функция обратного вызова трекера вызвана, но профиль может быть еще не готов, поэтому я не могу получить или отобразить имя Facebooker в этот момент.
мое решение-проверить текущий профиль != null и использовать его трекер для того, чтобы иметь имя Facebooker в то же время:
ProfileTracker fbProfileTracker = new ProfileTracker() { @Override protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) { // User logged in or changed profile } };проверьте статус входа, а затем получить имя пользователя:
Profile profile = Profile.getCurrentProfile(); if (profile != null) { Log.v(TAG, "Logged, user name=" + profile.getFirstName() + " " + profile.getLastName()); }
вы можете использовать тот же способ, что и Фелипе, упомянутый в его ответе, или вы можете использовать два других способа. Но, похоже, AccessTokenTracker-это удобный способ, так как он помогает вам отслеживать токены доступа (использовать с классом ProfileTracker)
- если вы используете пользовательскую кнопку для входа в систему, используйте LoginManager call back
в вашем макете xml
<Button android:id="@+id/my_facebook_button" android:background="@drawable/btnfacebook" android:onClick="facebookLogin"/>в работе
в onclick Listener//Custom Button Button myFacebookButton = (Button) findViewById(R.id.my_facebook_button);public void facebookLogin(View view) { LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends")); }в конце 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"); } });
- если вы используете кнопку (com.фейсбук.авторизоваться.штучка.LoginButton) предоставляется в SDK использовать LoginButton обратного вызова (это crealy подробно в их справочнике doc -https://developers.facebook.com/docs/facebook-login/android/v2.3)
в вашем макете 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"/>в вашей активность
//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()); } });Не забудьте позвонить
callbackManager.onActivityResult(requestCode, resultCode, data);в вашей деятельности onActivityResult ()
его поздно отвечать, но теперь в версии
4.25.0наFacebook SDKесть такой метод:public void retrieveLoginStatus(Context context, LoginStatusCallback responseCallback)в которой говорится:
возвращает статус входа для пользователя. Это позволит вернуть доступ к маркер для приложения, если пользователь вошел в Facebook для Android приложение на одном устройстве и что пользователь ранее вошел в приложение. Если маркер доступа был получен, то тост будет показано сообщая пользователю, что они были зарегистрированы в.
и может использоваться как:
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(); } } );
по данным документация на facebook вы можете сделать это:
AccessToken accessToken = AccessToken.getCurrentAccessToken(); boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
Comments