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

时间:2015-03-31 10:53:14

标签: 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

                        }
            });

这是我用于onClickLogin的代码

public void onClickLogin() {
        LoginManager.getInstance().logInWithPublishPermissions(this, PERMISSIONS);
    }

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

7 个答案:

答案 0 :(得分: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");
            }
        }
    });

答案 1 :(得分:6)

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

确保您未在​​会话之间重新安装应用,或明确将当前访问令牌设置为空。

答案 2 :(得分:1)

我自己没有测试过,但我认为你可以做的是从回调的onSuccess方法中的LoginResult对象中获取AccessToken。

所以:AccessToken accessToken = loginResult.getAccessToken();

然后你会通过说:

来保存这个accessToken

AccessToken.setAccessToken(的accessToken);

然后当你调用AccessToken.getAccessToken时,它应该返回你保存的accessToken。

答案 3 :(得分:1)

Android Facebook sdk初始化需要一些时间初始化。 所以你需要在调用AccessToken.getCurrentAccessToken()

之前等待100毫秒

尝试此解决方案后,它正在为我工​​作::

        FacebookSdk.sdkInitialize(this.getApplicationContext());
    callbackManager = CallbackManager.Factory.create();

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {


            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

                        }
                    });


        }
    }, 100);

答案 4 :(得分:0)

原因是Facebook SDK配置文件缓存。

    AccessToken.setCurrentAccessToken(null); 
    Profile.setCurrentProfile(null);

在销毁活动之前尝试一下。也许它可以解决你的问题。第一次使用它是第二次清理缓存,你可以登录不同的帐户。

答案 5 :(得分:0)

1.将您的功能更改为此功能

public void onClickLogin() {
    LoginManager.getInstance().logInWithReadPermissions(activity_name.this, PERMISSIONS);
}

答案 6 :(得分:0)

步骤

1)FacebookSdk.sdkInitialize(getActivity()。getApplicationContext());

2)CallbackManager mCallbackManager = CallbackManager.Factory.create();

    LoginManager.getInstance().registerCallback(mCallbackManager,
            new FacebookCallback<LoginResult>() {

                @Override
                public void onSuccess(LoginResult loginResult) {
                    //you will get access token here
                    mAccessToken = loginResult.getAccessToken();



                }

                @Override
                public void onCancel() {

                }

                @Override
                public void onError(FacebookException error) {

                }
            });

3) //之后使用获取访问令牌 AccessToken mAccessToken = AccessToken.getCurrentAccessToken();

确定,如果你使用facebook登录片段,

1)确保使用Facebook回调管理器在片段中调用super.onActivityResult()。

2)检查super.onActivityResult()是否在相关的&#34;片段活动中被调用&#34;如果你在相关活动中覆盖onActivityResult。