无法为 Android 获取 Facebook SDK 4.8.1 的访问令牌(或)未调用 FacebookCallback(或)requestCode 在 Facebook 集成中不同

Can't get Access Token for Facebook SDK 4.8.1 for Android (OR) FacebookCallback is not called (OR) requestCode is different in Facebook integration

我按照 Facebook login for Android 将 FB 集成到我的 Android 应用程序中。完成了。我看到权限屏幕,用户必须在其中接受使用他的电子邮件 ID。问题是 none 的 FacebookCallback 回调被调用。

我按照上述教程中提到的相同步骤进行操作。

片段代码:

    public class MyFragment extends Fragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            FacebookSdk.sdkInitialize(this.getActivity().getApplicationContext());
           super.onCreate(savedInstanceState);
        }  

        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
                mButtonFbLogin.setReadPermissions(Arrays.asList("email"));
            mButtonFbLogin.setFragment(this);

            mCallbackManager = CallbackManager.Factory.create();

            mButtonFbLogin.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    Log.d(TAG, "FB Login Successful. Token : " +loginResult.getAccessToken());
                }

                @Override
                public void onCancel() {
                    Log.d(TAG, "FB Login cancelled..");
                }

                @Override
                public void onError(FacebookException e) {
                    Log.d(TAG, "FB Login failed. Exception : " +e.toString());
                }
            });
       }   

       @Override
       public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Log.d(TAG, "onActivityResult of Fragment..");
            mCallbackManager.onActivityResult(requestCode, resultCode, data);

    }

}

通过日志,我看到我的片段 onActivityResult 被调用,callbackManger 的 onActivityResult() 也被调用。但是调用了 none 的 Facebook Callback 回调。

有什么线索吗?

AccessToken.getCurrentAccessToken()是一种可以在onCreate()中使用的方法。但是有了这个我不能确切地知道第一次创建令牌的时间。

AccessTokenTracker实际上是跟踪令牌的变化,但不知道登录会话何时成功、失败或取消。

更新:

我刚刚尝试使用 AccessTokenTracker,但是在我在许可屏幕上按下“确定”并且控制权返回到我的片段后,没有调用 onCurrentAccessTokenChanged()。这是代码:

@Override public void onCreate(Bundle savedInstanceState) { FacebookSdk.sdkInitialize(this.getActivity().getApplicationContext());

mAccessTokenTracker = new AccessTokenTracker() {
    @Override
    protected void onCurrentAccessTokenChanged(
            AccessToken oldAccessToken,
            AccessToken currentAccessToken) {
        Log.d(TAG, "onCurrentAccessTokenChanged : old : " +oldAccessToken);
        Log.d(TAG, "onCurrentAccessTokenChanged : new : " +currentAccessToken);
    }
};
mAccessTokenTracker.startTracking();

super.onCreate(savedInstanceState);

}

我有 MainActivity,其中包含生成 CChildFragment 的 MainFragment。 ChildFragment 是添加 LoginButton 的地方。

MainActivity -> MainFragment -> ChildFragment (LoginButton)。

我在 MainActivity 和 ChildFragment 中也有 onActivityResult() 。在 MainActivity 的 onActivityResult() 中,我在调用 CallbackManager.onActivityResult() 的地方显式调用了 childFragment.onActivityResult()。我在 ChildFragment 中做了 setFragment(this)。一切正常,但 FacebookCallback 中的 none 回调被调用。

我尝试了多种解决方案并调试了 Facebook 代码,发现他们使用的 requestCode 作为索引来存储我们发送的回调。此代码在存储回调和检索回调时是不同的。所以什么也没发生。

作为 debuggin 的一部分,我将完整的代码移到了 MainFragment 中,它工作了。 :-)

因此,解决方案 是覆盖 MainFragment 中的 onActivityResult() 并从那里调用 ChildFragment 的 onActivityResult()。有效。

所以,结论是,如果你把 LoginButton 放在 child/nested 片段中,Facebook sdk 会调用父片段的 onActivityResult 而不是子片段的 onActivityResult() 或 Activity.