如何检查用户是否使用Android的FB SDK 4.0登录?

如何检查用户是否使用Android的FB SDK 4.0登录?,android,facebook,facebook-graph-api,login,Android,Facebook,Facebook Graph Api,Login,几天前,我在我的应用程序上实现了FB登录,今天我发现我实现的大多数东西现在都被弃用了 以前,我使用会话查看用户是否登录。但是,这在新SDK中不起作用 根据他们的文档,我们可以使用AccessToken.getCurrentAccessToken()和Profile.getCurrentProfile()来检查用户是否已经登录,但我无法使用这些 我试过这样的方法: if(AccessToken.getCurrentAccessToken() == null) 我想知道如果我可以在这里面使用它(这

几天前,我在我的应用程序上实现了FB登录,今天我发现我实现的大多数东西现在都被弃用了

以前,我使用
会话
查看用户是否登录。但是,这在新SDK中不起作用

根据他们的文档,我们可以使用
AccessToken.getCurrentAccessToken()
Profile.getCurrentProfile()
来检查用户是否已经登录,但我无法使用这些

我试过这样的方法:

if(AccessToken.getCurrentAccessToken() == null)
我想知道如果我可以在这里面使用它(这也是由FB提供的),这是否会起作用:

但是,我得到一个“无法解析符号‘回调’”。

编辑

好的,因此我可以通过以下方式检查用户是否登录:

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

然后,调用我的
updateWithToken
方法:

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

            LOAD ACTIVITY A!

    } else {

            LOAD ACTIVITY B!
    }
}
updateWithToken(AccessToken.getCurrentAccessToken());
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);
    }
}
现在,问题是:如果用户使用过该应用程序并且以前没有登录过,我可以检查一下!但是,如果用户是第一次使用应用程序,我的AccessTokenTracker永远不会调用
updateWithToken

如果有人能帮忙,我将不胜感激

谢谢

我明白了

首先,确保已初始化FB SDK。第二,增加以下内容:

accessTokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
            updateWithToken(newAccessToken);
        }
    };
当当前访问权限发生更改时,将调用此函数。也就是说,这只会在用户已经登录的情况下对您有所帮助

接下来,我们将其添加到
onCreate()
方法中:

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

            LOAD ACTIVITY A!

    } else {

            LOAD ACTIVITY B!
    }
}
updateWithToken(AccessToken.getCurrentAccessToken());
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);
    }
}
当然,我们的
updateWithToken()
方法:

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

            LOAD ACTIVITY A!

    } else {

            LOAD ACTIVITY B!
    }
}
updateWithToken(AccessToken.getCurrentAccessToken());
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);
    }
}

这是为我做的!=]

你可以使用Felipe在回答中提到的相同方法,也可以使用其他两种方法。但是AccessTokenTracker似乎是一种方便的方法,因为它可以帮助您跟踪访问令牌(与ProfileTracker类一起使用)

  • 如果您使用自定义按钮登录,请使用LoginManager回调
  • 比如说

    在布局xml中

        <Button
            android:id="@+id/my_facebook_button"
            android:background="@drawable/btnfacebook"
            android:onClick="facebookLogin"/>
    
    <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"/>
    
    单击Listener上的按钮

    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");
               }
           });
    
    //创建回调管理器以处理登录响应
    CallbackManager CallbackManager=CallbackManager.Factory.create();
    LoginManager.getInstance().registerCallback(callbackManager,new FacebookCallback()){
    @凌驾
    成功时公共无效(LoginResult LoginResult){
    i(标记“LoginManager FaceBookCallbackOnSuccess”);
    if(loginResult.getAccessToken()!=null){
    Log.i(标记“访问令牌::”+loginResult.getAccessToken());
    facebooksucces();
    }
    }
    @凌驾
    公开作废{
    i(标记“LoginManager FaceBookCallbackOnCancel”);
    }
    @凌驾
    公共无效onError(FaceBook例外e){
    i(标记“LoginManager FacebookCallback onError”);
    }
    });
    
  • 如果您正在使用SDK中提供的按钮(com.facebook.login.widget.LoginButton),请使用LoginButton回调(这在他们的参考文档中有详细说明-)
  • 比如说

    在布局xml中

        <Button
            android:id="@+id/my_facebook_button"
            android:background="@drawable/btnfacebook"
            android:onClick="facebookLogin"/>
    
    <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());
            }
        });
    
    //Facebook SDK提供的登录按钮
    LoginButton LoginButton=(LoginButton)findViewById(R.id.login_按钮);
    setReadPermissions(“用户朋友”);
    //回调注册
    registerCallback(callbackManager,newfacebookcallback()){
    @凌驾
    成功时公共无效(LoginResult LoginResult){
    //应用程序代码
    Log.i(标记“LoginButtonFaceBookCallbackOnSuccess”);
    if(loginResult.getAccessToken()!=null){
    Log.i(标记“访问令牌::”+loginResult.getAccessToken());
    facebooksucces();
    }
    }
    @凌驾
    公开作废{
    //应用程序代码
    i(标记“LoginButtonFaceBookCallbackOnCancel”);
    }
    @凌驾
    public void onError(facebook异常){
    //应用程序代码
    Log.i(标记“LoginButtonFaceBookCallbackOnError::”+exception.getMessage());
    Log.i(标记“Exception::”+Exception.getStackTrace());
    }
    });
    

    不要忘记调用
    callbackManager.onActivityResult(请求代码、结果代码、数据)
    在您的活动onActivityResult()中,一个简单得多的解决方案适用于我的案例(我不知道这是否是更优雅的方式):


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

    回复很晚,但现在在Facebook SDK的
    版本
    4.25.0
    中有一种方法:

    public void retrieveLoginStatus(Context context,
                                    LoginStatusCallback responseCallback)
    
    其中指出:

    检索用户的登录状态。这将返回一个访问权限 如果用户登录到Facebook for Android,应用程序的令牌 同一设备上的应用程序,并且该用户以前已登录 应用程序。如果检索到访问令牌,则将显示toast 告诉用户他们已登录

    并且可以像这样使用:

    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();
        }
    } );
    
    根据需要,您可以通过以下方式完成此操作:

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

    您是否尝试了Session.getActiveSession()方法?Session已从SDK 4.0中删除=/根据更新的文档,您可以尝试使用AccessTokenTracker。我知道我必须使用AccessToken,但正如我在问题中提到的:我不知道如何使用。如果用户是新用户,您是否解决了该问题?想知道你是怎么做的:)我已经做了选项2中的所有事情。单击FB登录按钮并单击确定后