android - 无法获取适用于 Android 的 Facebook SDK 4.8.1 的访问 token (或)未调用 FacebookCallback(或)requestCode 在 Facebook 集成中不同

标签 android integration access-token facebook-access-token android-facebook

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

我遵循了上述教程中提到的相同步骤。

  • 我启动了 FB SDK。
  • 然后创建了 CallBackManager 实例。
  • 有 setFragment(this)。
  • 以这种方式注册 FacebookCallback 回调

fragment 代码:

    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);

    }

}
  • 最后我调用了 mCallbackManager.onActivityResult(requestCode, resultCode, data);。我的 Activity 的 onActivityResult() 首先从我调用 fragment 的 onActivityResult() 的地方调用。

通过日志,我看到我的 fragment 的 onActivityResult 被调用,callbackManger 的 onActivityResult() 也被调用。但是没有调用 Facebook Callback 的回调。

有什么线索吗?

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

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

更新:

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

@覆盖 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(登录按钮)。

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

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

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

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

因此,结论是,如果您将 LoginButton 放在子 fragment/嵌套 fragment 中,Facebook sdk 将调用父 fragment 的 onActivityResult 而不是子 fragment 或 Activity 的 onActivityResult()。

关于android - 无法获取适用于 Android 的 Facebook SDK 4.8.1 的访问 token (或)未调用 FacebookCallback(或)requestCode 在 Facebook 集成中不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34594971/

相关文章:

android - ActionBar 中 MenuItem 的默认全息蓝色背景是什么?

Android SQLite 土耳其语

android - Android Studio:Gradle Sync的v4支持库失败

facebook - Libgdx + Facebook 集成?

matlab - 具有可变限制的积分

bitbucket - 为什么个人访问 token 不适用于 Bitbucket REST API?

android - 通过Gradle测试Google Cloud Messaging Push通知

java - 将 J2SE 应用程序与 Web 应用程序集成的最简单方法

api - Keycloak API 总是返回 401

c++ - 如何确定知名组中用户的成员身份为 Everyone