Can't get Access Token for Facebook SDK 4.8.1 for Android (OR) FacebookCallback is not called (OR) r

Posted

技术标签:

【中文标题】Can\'t get Access Token for Facebook SDK 4.8.1 for Android (OR) FacebookCallback is not called (OR) 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 integrationCan't get Access Token for Facebook SDK 4.8.1 for Android (OR) FacebookCallback is not called (OR) requestCode 在 Facebook 集成中不同 【发布时间】:2016-04-08 06:59:20 【问题描述】:

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

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

我启动了 FB SDK。 然后创建 CallBackManager 实例。 有 setFragment(this)。 以这种方式注册了 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);

    


最后我打电话给mCallbackManager.onActivityResult(requestCode, resultCode, data);。我的活动的 onActivityResult() 首先从我调用片段的 onActivityResult() 的地方调用。

通过日志,我看到我的片段的onActivityResult 被调用,回调管理器的onActivityResult() 也被调用。但是没有调用 Facebook Callback 的回调。

有什么线索吗?

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

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

更新:

我刚刚尝试使用 AccessTokenTracker,但在权限屏幕上按 OK 后未调用 onCurrentAccessTokenChanged() 并且控制权返回到我的片段。这是代码:

@覆盖 公共无效 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);

【问题讨论】:

请发布您的活动和片段代码 @HeshanSandeepa,添加了片段的代码。我在 Activity 中没有代码,但我从我的 Activity 中调用了我的片段的 onActivityResult()。这就是 Activity 中的全部内容。 【参考方案1】:

我有 MainActivity,它包含生成 CHildFragment 的 MainFragment。 ChildFragment 是添加 LoginButton 的位置。

MainActivity -> MainFragment -> ChildFragment (LoginButton)。

我在 MainActivity 和 ChildFragment 中也有 onActivityResult()。在 MainActivity 的 onActivityResult() 中,我显式调用了 childFragment.onActivityResult(),我调用了 CallbackManager.onActivityResult()。我在 ChildFragment 中做了 setFragment(this)。一切都很好,但 FacebookCallback 中的回调都没有被调用。

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

调试的一部分,我将完整的代码移到 MainFragment 并且它工作。 :-)

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

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

【讨论】:

facebook 这样做的唯一原因是活动上下文通过片段传递给 facebookSDK。 facebook SDK 使用该上下文来调用回调

以上是关于Can't get Access Token for Facebook SDK 4.8.1 for Android (OR) FacebookCallback is not called (OR) r的主要内容,如果未能解决你的问题,请参考以下文章

Spotipy 当前用户不工作 AttributeError:“str”对象没有属性“get_access_token”

iframe 导致 Can't Verify CSRF Token Authenticity n Rails

微信开发之c#下缓存jssdk的access_token

微信公众号 access_token缓存

微信access_token全局缓存,处理过期

Can't access Phpmyadmin in ubuntu error mysqli_real_connect(): (HY000/2002)