即使首次登录,Facebook AccessToken.getAccessToken在打开应用时仍为空

Roh*_*yal 11 android facebook facebook-graph-api facebook-android-sdk facebook-sdk-4.0

我已经集成了最新的Facebook android sdk(Sdk 4.0).这是我在onCreate方法中添加的代码.

FacebookSdk.sdkInitialize(this.getApplicationContext());
            callbackManager = CallbackManager.Factory.create();
            if(AccessToken.getCurrentAccessToken()!=null){
                Log.d(FBTAG,"facebook already logged in");
                isFBLogin = true;
            }
            LoginManager.getInstance().registerCallback(callbackManager,
                    new FacebookCallback<LoginResult>() {
                        @Override
                        public void onSuccess(LoginResult loginResult) {
                            // App code
                            Log.d(FBTAG,"facebook log in");
                            isFBLogin = true;
                        }

                        @Override
                        public void onCancel() {
                             // App code
                            isFBLogin = false;
                        }

                        @Override
                        public void onError(FacebookException error) {
                            isFBLogin = false;
                            Log.d(FBTAG,"facebook login error: "+error);
                            // App code

                        }
            });
Run Code Online (Sandbox Code Playgroud)

这是我用于onClickLogin的代码

public void onClickLogin() {
        LoginManager.getInstance().logInWithPublishPermissions(this, PERMISSIONS);
    }
Run Code Online (Sandbox Code Playgroud)

我可以通过单击登录按钮并处理onClickLogin函数来登录.现在,下次我打开应用程序的应用程序我正在检查AccessToken.getAccessToken,以检查用户是否已登录在facebook,但它始终为null.在新的sdk中无论如何都不能在后台登录,因此我不必要求用户始终像以前版本一样在会话类中登录.

Fra*_*ank 12

您还可以向sdkInitialize添加InitializeCallback并检查回调内的AccessToken:

FacebookSdk.sdkInitialize(getApplicationContext(), new FacebookSdk.InitializeCallback() {
        @Override
        public void onInitialized() {
            if(AccessToken.getCurrentAccessToken() == null){
                System.out.println("not logged in yet");
            } else {
                System.out.println("Logged in");
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 如果您在 Application#onCreate() 中初始化 Facebook SDK 并在 MainActivity 的 onCreate() 中检查当前访问令牌是否不为空,则存在竞争条件。在极少数情况下,用户会显示为已注销,因为我在 Facebook SDK 初始化之前不到 100 毫秒检查当前访问令牌。作为参考,访问令牌将始终为空,直到此未来任务完成执行:https://github.com/facebook/facebook-android-sdk/blob/6d960562a8b4a62c59c72898b07af67701a1ab2c/facebook/src/main/java/com/facebook/FacebookSdk .java#L225 (2认同)

小智 6

LoginManager返回的访问令牌将保存在共享首选项中,因此下次打开应用程序时,AccessToken.getCurrentAccessToken()应具有相同的访问令牌,这与Session类的相同.您可以查看SDK提供的示例以查看它们的工作情况.

确保您没有在会话之间重新安装应用程序,或者明确地将当前访问令牌设置为null.