无法为 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 回调被调用。
我按照上述教程中提到的相同步骤进行操作。
- 我启动了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);
。我的 activity 的 onActivityResult() 首先从我调用片段的 onActivityResult() 的地方调用。
通过日志,我看到我的片段 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.
我按照 Facebook login for Android 将 FB 集成到我的 Android 应用程序中。完成了。我看到权限屏幕,用户必须在其中接受使用他的电子邮件 ID。问题是 none 的 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);
。我的 activity 的 onActivityResult() 首先从我调用片段的 onActivityResult() 的地方调用。
通过日志,我看到我的片段 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.